2.5 类型转换器
让我们看一看与之前的Button声明(设置了Content和Background属性)等价的C#代码:
![]()
等一下!之前XAML文件中的“White”是如何与C#中的System.Windows.Media.Brushes. White静态值White(类型为System.Windows.Media.SolidColorBrush)等价的呢?确实,这个示例提供了一些如何使用字符串设置在XAML属性的细节,这些属性的类型既不是System.String,也不是System.Object。在这样的情况下,XAML解析器或编译器必须寻找一个类型转换器,该转换器知道如何将一个字符串表达式转换为一种想要的数据类型。WPF提供了许多常用数据类型的类型转换器,如Brush、Color、FontWeight、Point等,它们都是派生自TypeConverter的类(如BrushConverter、ColorConverter等),你也可以为自定义的数据类型写类型转换器。与XAML语言不同,类型转换器通常支持不区分大小写的字符串。
如果没有Brush类型转换器,你就必须使用属性元素语法来设置XAML中的Background属性,如下所示:

之所以这样可行,是因为有Color类型转换器来转换“White”字符串。如果没有Color类型转换器,你仍然可以写成:
![]()
之所以这也行得通,是因为有一个类型转换器可以把每个字符串“255”转换为一个Byte值,它正是Color类型的A、R、G和B属性所期望的值,没有这个类型转换器的话,你就无能为力了。因此,类型转换器并不仅仅增强了XAML的可读性,也允许一些本来不能被表达的概念得以表达。
在过程式代码中使用类型转换器
虽然设置Background为System.Windows.Media.Brushes.White的C#代码产生的结果与XAML声明中设置“White”字符串是一样的,但C#中实际上并没有用到XAML解析器或者编译器所使用的相同的类型转换机制。下面的代码更精确地表达了运行时获取和执行适合Brush的类型转换器的过程:
与之前的C#代码不同,使用XAML时,拼错White不会导致编译错误,但是会在运行时抛出一个异常。(虽然Visual Studio的确提供了XAML的编译时的错误警告。)






