闲话WPF之五(XAML中的类型转换)
2006-12-18 14:26
363 查看
在前面关于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类型。
类型转换器对开发人员有什么作用呢?通过它我们可以实现自定义的类型转换。下面一个例子演示了如何从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>
最后使用这个自定义的类型转换器:
<DataTemplate DataType="{x:Type Color}">
<Rectangle Height="25" Width="25" Fill="{Binding Converter={StaticResource ColorToBrush}}"/>
</DataTemplate>
其实WPF所使用的这种类型转换从.Net Framework1.0已经开始并广泛应用。有兴趣的朋友可以参考MSDN的介绍:通用类型转换(Generalized Type Conversion)
<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类型。
类型转换器对开发人员有什么作用呢?通过它我们可以实现自定义的类型转换。下面一个例子演示了如何从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>
最后使用这个自定义的类型转换器:
<DataTemplate DataType="{x:Type Color}">
<Rectangle Height="25" Width="25" Fill="{Binding Converter={StaticResource ColorToBrush}}"/>
</DataTemplate>
其实WPF所使用的这种类型转换从.Net Framework1.0已经开始并广泛应用。有兴趣的朋友可以参考MSDN的介绍:通用类型转换(Generalized Type Conversion)
相关文章推荐
- WPF中在XAML中实现数据类型转换的两种方法
- wpf中xaml的类型转换器与标记扩展
- wpf中xaml的类型转换器与标记扩展
- WPF 中Color类型转换成Brush
- XAML属性赋值转换之谜(WPF XAML语法解密)
- 新建WPF应用程序操作提示:没有可用于"D:\xx\……\xx.xaml"的编辑器确保已安装文件类型(.xaml)的应用程序
- WPF值通用的类型转换器详解(转)
- WPF学习系列011: 2.7.3 更多类型转换
- WPF学习:4.类型转换和标记扩展
- 关于WPF 中 “System.Windows.Markup.XamlParseException”类型的未经处理的异常在 PresentationFramework.dll 中发生 异常的处理。
- 闲话WPF之三(XAML的名字空间)
- WPF数据类型转换
- 更多类型转换 --WPF学习摘要
- WPF页面xaml中给属性赋枚举类型
- WPF外包公司——HTMLTOXAML转换组件(HTML转XAML兼容WPF、SL、WIN8)
- WPF类型转换
- 新建WPF应用程序操作提示:没有可用于"D:\xx\……\xx.xaml"的编辑器确保已安装文件类型(.xaml)的应用程序
- 闲话Java中的类型转换
- 数据类型转换整理
- VC++中几种数据类型(CString, char*, char, ******等)之间的相互转换