WPF开发工具的出现,在当今这一技术革新速度非常快的时代中,仍然长时间的占据着主导地位。它的方便灵活为开发人员带来许多便捷之处。我们先来看看WPF类型转换器相关概念说明。#t#
我们先来看下面这一代码片段:
< 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>