首页 > 其他分享 >WPF 类型转换器的实现

WPF 类型转换器的实现

时间:2024-08-19 15:16:24浏览次数:8  
标签:string System value MoneyType using 类型 转换器 WPF public

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

相关文章

  • Redis的十大数据类型的常用命令(上)
    目录1.key的操作命令2.String的常用命令案例一:dy点赞案例二:文章的喜欢数3.List的常用命令案例:公众号订阅的消息4.Hash的常用命令案例:早期购物车设计5.Set的常用命令案例一:抽奖小程序案例二:朋友圈点赞案例三:朋友圈点赞6.Zset的常用集合(sortedset)案例一:根据商品......
  • 创建多种类型的流
    顺序:这是默认的流类型,其中元素按顺序逐个处理。顺序流以线性顺序处理数据,保持元素在源中出现的顺序。这适用于顺序很重要而性能不是关键问题的操作。并行:并行流允许使用多个线程同时处理元素。并行流可以通过将工作负载划分到多个线程中来显著提高大型数据集的性能。这对于可以并......
  • TypeScript学习之旅--对象数据类型
    1、对象类型声明1leta:{name:string,age:number};2a={name:"John",age:30};如果想设定多个参数且不确定参数类型,可用any,类似于参数列表,不限制参数个数和类型1leta:{name:string,age:number,[pro:string]:any};2a={name:"John",age:30,pro1:100,pro2:"Hello"};......
  • 何谓相等 (Equality),在类型理论(Type Theory)语境下
    两个元素a,b相等,即a=b,就是a和b是被完全一样地构建出来的。在《类型(Type)是可构建集合(constructiveset)》 一文中,说到,类型中的每个元素都是可构建的,因此,如果在一个类型中的两个元素a,b,是通过一样的方式构建出来,包括其构建时的输入,构建函数,那么,就说a等于b,a=b。......
  • TypeScript学习之旅--数据类型
    TypeScript为JavaScript的超集(ECMAScript6),这个语言添加了基于类的面向对象编程。TypeScript作为JavaScript很大的一个语法糖,本质上是类似于css的less、sass,都是为了易于维护、开发,最后还是编译成JavaScript。Types所有类型都是any类型的子类型,其他类型被分成元类型(pri......
  • .NET+WPF 桌面快速启动工具 GeekDesk
    前言大家在平时工作中,是不是经常为了找某个文件或者应用而在电脑桌面上来回翻找?桌面图标乱七八糟,每次找东西都像在大海捞针一样。今天给大家介绍一个开源项目GeekDesk,它能够让桌面焕然一新,工作效率翻倍!GeekDesk是一个小巧、美观的桌面快速启动工具,它集成了强大的搜索功能,让我......
  • 编程语言的核心:类型系统(Type System)
    编程语言的核心是其类型系统,只要掌握了其类型系统,对整门编程语言的掌握便事半功倍。为啥这么说呢?首先,在设计一门编程语言的时候,会针对该编程语言所作用的问题域(ProblemDomain)和解决域(SolutionDomain),进行设计。由此,对于问题域和解决域的抽象,就行形成该编程语言的抽......
  • 基于VSC的MVDC微电网(±10kV)转换器的互连通过等效RL电缆模块实现,此外,在电缆侧引入了
     ......
  • 值类型和引用类型、装箱和拆箱、静态类和普通类、方法的重载、继承和多态、访问修饰符
    目录一、值类型和引用类型的区别?值类型(ValueTypes)定义:特点:示例:引用类型(ReferenceTypes)定义:特点:示例:举例说明:总结:二、装箱和拆箱装箱(Boxing)特点:示例:拆箱(Unboxing)特点:示例:示例代码:装箱和拆箱的影响最佳实践:三、静态类和普通类的区别?静态类(Static......
  • 【OpenCV教程】OpenCV中的数据类型
    @目录1.CV_8U2.CV_8S3.CV_16U4.CV_16S5.CV_16F6.CV_32S7.CV_32F8.CV_64F9.一图流1.CV_8UCV_8U:占8位的unsignedCV_8UC(n):占8位的unsignedcharCV_8UC1:占8位的unsignedchar一通道CV_8UC2:占8位的unsignedchar二通道CV_8UC3:占8位的unsignedchar三通道CV_8UC4:占8位......