在WPF中键入Converter

时间:2011-10-12 10:30:54

标签: wpf wpf-controls

我已经阅读了这篇文章,但我仍然不太清楚Type Converter及其用法。

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

任何人都可以解释它是什么以及在WPF中可以做些什么。

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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.ColorColor

可以使用显式转换器进行第一个简化,该转换器能够理解字符串文字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解析器或编译器均遵循以下规则   遇到和解释子元素时:

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

  2.   
  3. 否则,如果类型实现IDictionary,则使用x:Key属性值作为键,并为每个子对象调用IDictionary.Add。   值的元素。 (尽管XAML2009会先检查IDictionary   IList并支持其他收集接口,如前所述。)

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

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

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

  10.   

以不同的方式回答有关转换器收益的问题:该收益来自上面的规则4。