这很烦人:
<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
属性。)
答案 0 :(得分:2)
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);
}
该方法的最后一部分似乎可以解决问题。
答案 1 :(得分:0)
Benjamin Podszun的答案在这里不起作用,因为XAML解析器似乎忽略了通过TypeDescriptor
添加的属性,但绑定却没有,所以你可以用一个来解决这个问题:
<GeometryDrawing Pen="{Binding Source=Black}"/>
我承认不是很优雅,类似地你可以使用markup extension作为笔厂......