【发布时间】:2019-11-01 21:41:47
【问题描述】:
我已经阅读了这篇文章,但我对类型转换器及其用法仍然不是很清楚。
http://msdn.microsoft.com/en-us/library/aa970913.aspx
谁能解释一下它是什么以及在 WPF 中可以用它做什么。
【问题讨论】:
标签: wpf wpf-controls
我已经阅读了这篇文章,但我对类型转换器及其用法仍然不是很清楚。
http://msdn.microsoft.com/en-us/library/aa970913.aspx
谁能解释一下它是什么以及在 WPF 中可以用它做什么。
【问题讨论】:
标签: wpf wpf-controls
如果您有一个不属于 string 类型的属性,但您需要从 XAML 特性设置它,则需要将 XAML 中指定的 string 转换为目标属性类型。因此,类型转换器。
【讨论】:
例如 - 当您在 XAML 中设置背景属性时,您可以编写“Red”,在后面的代码中您不能只为 Background 属性提供字符串“Red”,因为它的类型是 Brush。 WPF 使用类型转换器将字符串转换为画笔。
【讨论】:
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.FromArgb(255, 255, 255, 255) 获得的Color 实例的显式转换器,可以进行第一个简化。这个简化现在允许我们写:
<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 行代码开始,到只有 1 行结束!
关于如何解释 XML 元素字符串文字内容的最后一句话(仍然来自同一本书):
对象元素子项的 XAML 处理规则
您现在已经看到了对象元素的三种类型的子元素。至 避免歧义,任何有效的 XAML 解析器或编译器都遵循这些规则 遇到和解释子元素时:
如果该类型实现 IList,则为每个孩子调用 IList.Add。
否则,如果该类型实现 IDictionary,则为每个孩子调用 IDictionary.Add,使用键的 x:Key 属性值和 值的元素。 (虽然 XAML2009 之前检查了 IDictionary IList 并支持其他集合接口,如前所述。)
否则,如果父级支持内容属性(由 System.Windows.Markup.ContentPropertyAttribute 指示)和 child 与该属性兼容,将 child 视为其值。
否则,如果子是纯文本并且存在类型转换器以 将子类型转换为父类型(并且没有设置任何属性 在父元素上),将子元素视为类型的输入 转换器并将输出用作父对象实例。
否则,将其视为未知内容并可能引发错误。
以不同的方式回答您关于转换器收益的问题:此收益来自上述规则 4。
【讨论】: