WPF中的TypeConverters和MarkupExtension有什么区别

时间:2011-07-05 13:55:43

标签: wpf xaml

TypeConvertersMarkupExtension之间的区别是什么?

2 个答案:

答案 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。

因此,类型转换器非常适合特定类型的特定属性,您希望接受比类型本身定义的更大范围的值。标记扩展非常适用于开发人员决定何时何地使用它的更通用的用途