我已经阅读了这篇文章,但我仍然不太清楚Type Converter及其用法。
http://msdn.microsoft.com/en-us/library/aa970913.aspx
任何人都可以解释它是什么以及在WPF中可以做些什么。
答案 0 :(得分:7)
如果您的属性不是string
类型,但您需要从XAML属性设置它,则需要将XAML中指定的string
转换为目标属性类型。因此,键入转换器。
答案 1 :(得分:2)
例如 - 当您在XAML中设置背景属性时,您可以编写“红色”,在代码后面您不能只为Background属性提供字符串“Red”,因为它的类型是Brush。 WPF使用类型转换器从字符串转换为画笔。
答案 2 :(得分:0)
WPF 4.5 Unleashed对XAML声明性语言进行了广泛介绍。某些页面可以在Google Books上阅读。我现在指的是page 26。
如果我们要指定Button
对象(实际上是Control.Background
)的背景色,只要类型转换器不是明确地,这就是我们需要做的(由Microsoft添加)到我们使用的类中:
<Button>
<Button.Background>
<SolidColorBrush>
<SolidColorBrush.Color>
<Color A="255" R="255" G="255" B="255" />
</SolidColorBrush.Color>
</Button.Background>
</SolidColorBrush>
</Button>
在此声明中,
<Button.Background>
<SolidColorBrush>
意味着我们创建SolidColorBrush
的实例并将其分配给Button.Background
属性,该属性的类型是抽象类型Brush
。
类似地,
<SolidColorBrush.Color>
<Color A="255" R="255" G="255" B="255" />
意味着我们创建具有相应属性的Color
实例,并将其分配给类型为SolidColorBrush.Color
的Color
。
可以使用显式转换器进行第一个简化,该转换器能够理解字符串文字White
作为Color
XML元素的内容提供时必须转换为Color
实例由Color.FromArgb(255, 255, 255, 255)
获得。现在,这种简化使我们可以编写:
<Button>
<Button.Background>
<SolidColorBrush>
<SolidColorBrush.Color>
White
</SolidColorBrush.Color>
</Button.Background>
</SolidColorBrush>
</Button>
通过指定type converter attribute,已将使用这种转换器的可能性显式添加到Color
结构的声明中:
[TypeConverter(typeof(ColorConverter))]
public struct Color : IFormattable, IEquatable<Color>
转换器是ColorConverter。
让我们进一步前进,并在Brush
上添加类型转换器,即Control.Background的类型。
[TypeConverter(typeof(BrushConverter))]
public abstract class Brush : Animatable, IFormattable, DUCE.IResource
此转换器将用SolidColorBrush
实例替换有效的字符串文字内容,现在允许:
<Button>
<Button.Background>
White
</SolidColorBrush>
</Button>
这是解释XML内容时XAML所允许的简化背后的机制。 XAML允许的最后一种简化:我们可以使用XAML的属性语法而不是元素语法:
<Button Background="White" />
哇!我们从9行代码开始,到仅以一行代码结束!
关于如何解释XML元素字符串文字内容的最后一句话(仍然是同一本书):
对象元素子代的XAML处理规则
您现在已经看到对象元素的三种子类型。至 为避免歧义,任何有效的XAML解析器或编译器均遵循以下规则 遇到和解释子元素时:
如果该类型实现IList,则为每个孩子调用IList.Add。
否则,如果类型实现IDictionary,则使用x:Key属性值作为键,并为每个子对象调用IDictionary.Add。 值的元素。 (尽管XAML2009会先检查IDictionary IList并支持其他收集接口,如前所述。)
否则,如果父级支持content属性(由System.Windows.Markup.ContentPropertyAttribute指示)和 child与该属性兼容,将child作为其值。
否则,如果子项是纯文本并且存在类型转换器以 将子级转换为父级类型(并且未设置任何属性 (在父元素上),将子对象视为类型的输入 转换器并将输出用作父对象实例。
否则,将其视为未知内容,并可能引发错误。
以不同的方式回答有关转换器收益的问题:该收益来自上面的规则4。