WPF类型转换的应用对于开发人员来说是非常熟悉的。因为在实际编程中,会经常碰到这一情况的出现。那么我们就在这里先来介绍一些WPF类型转换相关基础知识。#t#
在前面关于XAML的Post当中,简单说明了XAML如果引入自定义名称空间。还提到过XAML基本上也是一种对象初始化语言。XAML编译器根据XAML创建对象然后设置对象的值。比如:
- < Button Width=”100”/>
很明显,我们设置Button的宽度属性值为100。但是,这个“100”的字符串为什么可以表示宽度数值呢?在XAML中的所有属性值都是用文本字符串来描述,而它们的目标值可以是double等等。WPF如何将这些字符串转换为目标类型?
答案是类型转换器(TypeConverter)。WPF之所以知道使用Double类型是因为在FrameworkElement类中的WidthProperty字段被标记了一个TypeConverterAttribute,这样就可以知道在类型转换时使用何种类型转换器。
TypeConverter是一种转换类型的标准方法。.NET运行时已经为标准的内建类型提供了相应的TypeConverter。所以我们可以用字符串值指定元素的属性。
然而并不是所有的属性都标记了一个TypeConverterAttribute。这种情况下,WPF将根据属性值的目标类型,比如Brush,来判断使用的类型转换器。虽然属性本身没有指定TypeConverterAttribute,但是目标类型Brush自己标记了一个TypeConverterAttribute来指定它的类型转换器:BrushConverter。
所以在转换这种属性时将自动使用目标值类型的BrushConverter将文本字符串类型的属性值转换为Brush类型。
类型转换器对开发人员有什么作用呢?通过它我们可以实现自定义的WPF类型转换。下面一个例子演示了如何从Color类型转换为SolidColorBrush。
- [ValueConversion(typeof(Color),
typeof(SolidColorBrush))]- public class ColorBrushConverter
: IValueConverter- {
- public object Convert(object value,
Type targetType, object parameter,
System.Globalization.CultureInfo culture)- {
- Color color = (Color)value;
- return new SolidColorBrush(color);
- }
- public object ConvertBack(object value,
Type targetType, object parameter,
System.Globalization.CultureInfo culture)- {
- return null;
- }
- }
然后我们可以在资源中定义一个ColorBrushConverter 实例(src是一个自定义命名空间,引入了ColorBrushConverter 类所在的Assembly)。
- < Application.Resources>
- < src:ColorBrushConverter
x:Key="ColorToBrush"/>- < /Application.Resources>
***使用这个自定义的WPF类型转换:
- < DataTemplate DataType=
"{x:Type Color}">- < Rectangle Height="25"
Width="25" Fill="{Binding
Converter={StaticResource
ColorToBrush}}"/>- < /DataTemplate>
其实WPF所使用的这种WPF类型转换从.Net Framework1.0已经开始并广泛应用。