WPF 型別轉換器的實現

【君莫笑】發表於2024-08-19

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

相關文章