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