【问题标题】:Type Converter in WPFWPF中的类型转换器
【发布时间】:2019-11-01 21:41:47
【问题描述】:

我已经阅读了这篇文章,但我对类型转换器及其用法仍然不是很清楚。

http://msdn.microsoft.com/en-us/library/aa970913.aspx

谁能解释一下它是什么以及在 WPF 中可以用它做什么。

【问题讨论】:

标签: wpf wpf-controls


【解决方案1】:

如果您有一个不属于 string 类型的属性,但您需要从 XAML 特性设置它,则需要将 XAML 中指定的 string 转换为目标属性类型。因此,类型转换器。

【讨论】:

    【解决方案2】:

    例如 - 当您在 XAML 中设置背景属性时,您可以编写“Red”,在后面的代码中您不能只为 Background 属性提供字符串“Red”,因为它的类型是 Brush。 WPF 使用类型转换器将字符串转换为画笔。

    【讨论】:

    • 与数据绑定没有任何关系。
    • 我应该如何以及为什么要使用没有数据绑定的转换器?
    • Type converters != Value converters。它们是完全不同的,前者与数据绑定无关。
    【解决方案3】:

    WPF 4.5 UnleashedXAML 声明性语言进行了广泛的介绍。有些页面可以在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 解析器或编译器都遵循这些规则 遇到和解释子元素时:

    1. 如果该类型实现 IList,则为每个孩子调用 IList.Add。

    2. 否则,如果该类型实现 IDictionary,则为每个孩子调用 IDictionary.Add,使用键的 x:Key 属性值和 值的元素。 (虽然 XAML2009 之前检查了 IDictionary IList 并支持其他集合接口,如前所述。)

    3. 否则,如果父级支持内容属性(由 System.Windows.Markup.ContentPropertyAttribute 指示)和 child 与该属性兼容,将 child 视为其值。

    4. 否则,如果子是纯文本并且存在类型转换器以 将子类型转换为父类型(并且没有设置任何属性 在父元素上),将子元素视为类型的输入 转换器并将输出用作父对象实例。

    5. 否则,将其视为未知内容并可能引发错误。

    以不同的方式回答您关于转换器收益的问题:此收益来自上述规则 4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多