1、MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:WpfApplication1" Title="MainWindow" Height="350" Width="525"> <DockPanel HorizontalAlignment="Left" Height="322" LastChildFill="False" VerticalAlignment="Top" Width="515" Margin="0,0,0,-2"> <Button DockPanel.Dock="Left" Background="AliceBlue" Width="264"> <local:Book Name="CookBook" Price="$0.1"> 内容:梦里花落知多少 </local:Book> </Button> <Button DockPanel.Dock="Right" Width="249"> <Button.Background> <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> <GradientStop Color="Yellow" Offset="0.0"/> <GradientStop Color="Aquamarine" Offset="0.25"/> <GradientStop Color="Bisque" Offset="0.75"/> <GradientStop Color="Coral" Offset="1.0"/> </LinearGradientBrush> </Button.Background> Hello XAML </Button> </DockPanel> </Window>
第一个Button的Content属性的值设置成一个自定义的Book类,该Book对象调用ToString()方法返回的字符串就会显示在Button上,注意该Book对象的Price属性设置为"$0.1",即0.1美元,
通过类型转换器,将会把这个值转换为"0.8"(人民币)。
第二个Button使用了渐变画刷来设置背景。
2、Book.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; //ContenProperty所在的命名空间 using System.Windows.Markup; namespace WpfApplication1 { [ContentProperty("Text")] //声明Content属性 public class Book { public Book() { } //Name属性 public string Name { get; set; } //Price属性的数据类型是一个MoneyType类,该类声明了类型转换器,可以将带有美元符号的价格转换为人民币 public MoneyType Price { get; set; } //Text属性 public string Text { get; set; } public override string ToString() { string str = Name + "售价为:" + Price + "元\n"+Text; return str; } } }
Book类中声明了三个自动属性,其中将Text属性声明为ContentProperty,这样不必使用Property-Element语法就可以直接成为Button元素的子类;Price属性是MoneyType类型,该类声明了一个类型转换器,可以将美元转换为人民币。
3、MoneyType.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //TypeConverter所在的命名空间 using System.ComponentModel; namespace WpfApplication1 { //声明类型转换器 [TypeConverter(typeof(MoneyConverter))] public class MoneyType { private double _value; public MoneyType() { _value = 0; } public MoneyType(double value) { _value = value; } public override string ToString() { return _value.ToString(); } //价格转换方法,这里只考虑美元和人民币,不考虑其他币种 public static MoneyType Parse(string value) { string str = (value as string).Trim(); if (str[0] == '$') { //将美元转换为人民币 string newprice = str.Remove(0, 1); double price = double.Parse(newprice); return new MoneyType(price * 8); } else { //不带特殊符号的字符串默认识别为人民币 double price = double.Parse(str); return new MoneyType(price); } } } }
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); } } }
来源:https://www.cnblogs.com/tt2015-sz/p/4744181.html
标签:string,System,value,MoneyType,using,类型,转换器,WPF,public From: https://www.cnblogs.com/ywtssydm/p/18367349