TypeConverters
和MarkupExtension
之间的区别是什么?
答案 0 :(得分:7)
TypeConverters用于将一种类型隐式转换为另一种类型。例如,BrushConverter可以将字符串“Red”转换为其Color属性设置为红色的SolidColorBrush。在这种情况下:
<Button Background="Red" />
MarkupExtension允许您为属性提供更多自定义值。还有一些特殊的标记扩展,Binding,MultiBinding和DynamicResource。这些不仅仅提供静态值,而是提供更动态的值。
因此,您可以构建执行与类型转换器相同操作的标记扩展,但是您必须明确使用它们,而不是类型转换器的隐式特性。
答案 1 :(得分:1)
TypeConverter 旨在从一种类型转换为另一种类型。有几个开箱即用,如 BrushConverter , ColorConverter , BooleanConverter 等等。有关完整列表,请参阅here。类型转换器的优点在于它们可以通过在类定义中使用以下atttribute定义应用于属性定义...
[TypeConverterAttribute(typeof(BrushConverter)]
public Brush Background
{
...
}
... BrushConverter 的实现知道如果它接收一个字符串作为输入,它应该尝试将其转换为已知颜色的SolidBrush实例。这意味着您的XAML不需要为属性分配实际的SolidBrushes.Red引用,而是使用简单的字符串......
<Button Background="Red" />
......写作和理解起来要快得多。但是,TypeConverter为属性赋值调用了 ALWAYS ,并且无法阻止XAML调用TypeConverter。
MarkupExtension 用于返回随后分配给指定属性的对象。这样更灵活,因为您可以决定何时何地使用MarkupExtension,并且不限制使用属性预先标记的特定属性。标记扩展的示例是Binding,StaticResource和DynamicResource。
因此,类型转换器非常适合特定类型的特定属性,您希望接受比类型本身定义的更大范围的值。标记扩展非常适用于开发人员决定何时何地使用它的更通用的用途