【问题标题】:How to implement a TypeConverter for a type and property I don't own?如何为我不拥有的类型和属性实现 TypeConverter?
【发布时间】:2010-01-04 14:22:11
【问题描述】:

这很烦人:

<GeometryDrawing>
    <GeometryDrawing.Pen>
        <Pen Brush="Black"/>
    </GeometryDrawing.Pen>
</GeometryDrawing>

我想要这个:

<GeometryDrawing Pen="Black"/>

所以我写了TypeConverter

public class PenConverter : TypeConverter
{
    static readonly BrushConverter brushConverter = new BrushConverter();

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string)) return true;
        return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        var s = value as string;
        if (a != null)
        {
            var brush = brushConverter.ConvertFromInvariantString(s) as Brush;
            return new Pen(brush, 1);
        }
        return base.ConvertFrom(context, culture, value);
    }
}

现在,我如何将它与Pen 类型链接起来?我不能只添加一个TypeConverterAttribute,因为我不拥有它(我也不拥有GeometryDrawing.Pen 属性)。

【问题讨论】:

标签: c# wpf xaml typeconverter


【解决方案1】:

This link here 声称你可以做类似的事情(逐字复制,感谢那个人)

public static void Register<T, TC>() where TC: TypeConverter
{
 Attribute[] attr = new Attribute[1];
 TypeConverterAttribute vConv = new TypeConverterAttribute(typeof(TC));
      attr[0] = vConv;
 TypeDescriptor.AddAttributes(typeof(T), attr);
}

该方法的最后一部分似乎可以解决问题。

【讨论】:

  • 这似乎不起作用。我在 InitializeComponent 之前调用 AddAttributes 并且它仍然抛出。 :(
  • 您是否通过访问 TypeDescriptor.GetConverter(typeof(Pen)) 来检查 Typeconverter 是否工作正常?
【解决方案2】:

Benjamin Podszun 的答案在这里不起作用,因为 XAML 解析器似乎忽略了通过 TypeDescriptor 添加的属性,但绑定却没有,因此您可以使用一个来解决此问题:

<GeometryDrawing Pen="{Binding Source=Black}"/>

我承认不是很优雅,同样你可以使用markup extension 作为钢笔工厂...

【讨论】:

    猜你喜欢
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多