类型转换器提供字符串文本到值的转换方法来帮助WPF设计时在XAML中配置属性。具体用法可以参考MSDN的文档:。
下面是一个Demo,参考自<葵花宝典--WPF自学手册>。
1、MainWindow.xaml
17 8 13 25 26 27
第一个Button的Content属性的值设置成一个自定义的Book类,该Book对象调用ToString()方法返回的字符串就会显示在Button上,注意该Book对象的Price属性设置为"$0.1",即0.1美元,通过类型转换器,将会把这个值转换为"0.8"(人民币)。
第二个Button使用了渐变画刷来设置背景。
2、Book.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 //ContenProperty所在的命名空间 6 using System.Windows.Markup; 7 8 namespace WpfApplication1 9 {10 [ContentProperty("Text")] //声明Content属性11 public class Book12 {13 public Book()14 {15 }16 //Name属性17 public string Name18 {19 get;20 set;21 }22 //Price属性的数据类型是一个MoneyType类,该类声明了类型转换器,可以将带有美元符号的价格转换为人民币23 public MoneyType Price 24 {25 get;26 set;27 }28 //Text属性29 public string Text { get; set; }30 31 public override string ToString()32 {33 string str = Name + "售价为:" + Price + "元\n"+Text;34 return str;35 }36 }37 }
Book类中声明了三个自动属性,其中将Text属性声明为ContentProperty,这样不必使用Property-Element语法就可以直接成为Button元素的子类;Price属性是MoneyType类型,该类声明了一个类型转换器,可以将美元转换为人民币。
3、MoneyType.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 //TypeConverter所在的命名空间 7 using System.ComponentModel; 8 9 namespace WpfApplication110 {11 //声明类型转换器12 [TypeConverter(typeof(MoneyConverter))]13 public class MoneyType14 {15 private double _value;16 public MoneyType() { _value = 0; }17 public MoneyType(double value)18 {19 _value = value;20 }21 public override string ToString()22 {23 return _value.ToString();24 }25 //价格转换方法,这里只考虑美元和人民币,不考虑其他币种26 public static MoneyType Parse(string value)27 {28 string str = (value as string).Trim();29 if (str[0] == '$')30 {31 //将美元转换为人民币32 string newprice = str.Remove(0, 1);33 double price = double.Parse(newprice);34 return new MoneyType(price * 8);35 }36 else37 {38 //不带特殊符号的字符串默认识别为人民币39 double price = double.Parse(str);40 return new MoneyType(price);41 }42 }43 }44 }
MoneyType类中声明了类型转换器,并且实现了一个类方法Parse(),在该方法中完成对字符串的转换。
4、MoneyConverter.cs
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;//TypeConverter所在的命名空间using System.ComponentModel;namespace WpfApplication1{ public class MoneyConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(string)) return true; return base.CanConvertFrom(context, sourceType); } //转换为字符串类型其实不需要重写此方法 public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(string)) { return true; } return base.CanConvertTo(context, destinationType); } //将string转换为MoneyType public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string) return MoneyType.Parse((string)value); return base.ConvertFrom(context, culture, value); } //将MoneyType转换为string public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string)) { return ((MoneyType)value).ToString(); } return base.ConvertTo(context, culture, value, destinationType); } }}
这个类型转换器实现了string和MoneyType的相互转换。
5、运行效果