WPF:类型转换器的实现

类型转换器提供字符串文本到值的转换方法来帮助WPF设计时在XAML中配置属性。具体用法可以参考MSDN的文档:如何:实现类型转换器

下面是一个Demo,参考自<WPF葵花宝典自学手册>。

1、MainWindow.xaml

 1 <Window x:Class="WpfApplication1.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:sys="clr-namespace:System;assembly=mscorlib"
 5         xmlns:local="clr-namespace:WpfApplication1"
 6         Title="MainWindow" Height="350" Width="525">
 7     <Window.Resources>
 8         <sys:String x:Key="string1">李白</sys:String>
 9     </Window.Resources>
10     <DockPanel HorizontalAlignment="Left" Height="322" LastChildFill="False" VerticalAlignment="Top" Width="515" Margin="0,0,0,-2">
11         <Button DockPanel.Dock="Left" Background="AliceBlue" Width="264">
12             <local:Book Name="CookBook" Price="$0.1">
13                 内容:梦里花落知多少
14             </local:Book>
15         </Button>
16         <Button DockPanel.Dock="Right" Width="249">
17             <Button.Background>
18                 <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
19                     <GradientStop Color="Yellow" Offset="0.0"/>
20                     <GradientStop Color="Aquamarine" Offset="0.25"/>
21                     <GradientStop Color="Bisque" Offset="0.75"/>
22                     <GradientStop Color="Coral" Offset="1.0"/>
23
24                 </LinearGradientBrush>
25             </Button.Background>
26             Hello XAML
27         </Button>
28     </DockPanel>
29
30 </Window>

第一个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 Book
12     {
13         public Book()
14         {
15         }
16         //Name属性
17         public string Name
18         {
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 WpfApplication1
10 {
11     //声明类型转换器
12     [TypeConverter(typeof(MoneyConverter))]
13     public class MoneyType
14     {
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             else
37             {
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、运行效果

时间: 2024-09-30 15:59:15

WPF:类型转换器的实现的相关文章

WPF(4)类型转换器和标记扩展

介绍 之前讨论了WPF的基础架构,然后逐步开始学习布局面板,转换,介绍了不同的控件,容器,UI转换等.在这篇文章中,我将讨论每个创建XAML应用前的开发人员应该了解的关于XAML最重要的东西. 标记扩展是一种对XAML的扩展,你可以用来对基于XAML的程序应用自定义的规则.在你的设计中,你如果有任何的想对你的程序施加的自定义行为,你都可以使用标记扩展来实现.这里我们将讨论你可以怎样使用标记扩展对XAML生成自定义的行为. XAML或者说可扩展应用程序标记语言实际上是一种定义了特殊架构的XML格式

WPF值转换器

一.摘要 本文通过实例演示WPF值转换器的应用,并在演示过程中,对WPF值转换器的相关知识点进行解释说明. 二.实例演示 1 新建WPF应用程序ConverterExp,程序结构如下图所示. 图1 程序结构图 程序的主画面如下图所示. 图2 程序主画面 程序完成功能: 通过改变画面中ComboBox控件的选中项来改变TextBlock控件的Background值. ComboBox控件的下拉列表中可供选择的项有"red""green"和"blue"

springmvc 类型转换器 自定义类型转换器

自定义类型转换器的步骤: 1.定义类型转换器 2.类型转换器的注册(在springmvc配置文件处理) 来解决多种日期格式的问题:

笔记02 文件上传、文件下载、类型转换器、国际化的支持

Struts2的上传 1. Struts2默认采用了apache commons-fileupload  2. Struts2支持三种类型的上传组件 3. 需要引入commons-fileupload相关依赖包 * commons-io-1.3.2.jar * commons-fileupload-1.2.1.jar 4. 表单中需要采用POST提交方式,编码类型需要使用:multipart/form-data 5. Struts2的Action     取得文件名称->>规则:输入域的名称+

SpringMVC类型转换器、属性编辑器

对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器.类型转换器 参数绑定流程 参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到DisptacherServlet,卸下请求中的数据 DisptacherServlet将请求中的数据发送给Controller 获取Controller需要接收的参数类型,将参数类型和请求数据发送给DataBinder DataBinder将参数类型和请求数据再发给TypeConverter,由Ty

struts局部、全局类型转换器

第01步:编写bean package com.self.bean; import java.util.Date; public class User { private Date birthday = null; public Date getBirthday() { System.out.println("获得-User:" + birthday); return birthday; } public void setBirthday(Date birthday) { System

14.SpringMVC核心技术-类型转换器

类型转换器 在前面的程序中,表单提交的无论是 int 还是 double 类型的请求参数,用于处理该请求 的处理器方法的形参, 均可直接接收到相应类型的相应数据,而非接收到 String 再手工转换. 那是因为在 SpringMVC 框架中,有默认的类型转换器. 这些默认的类型转换器,可以将 String 类型的数据,自动转换为相应类型的数据 但默认类型转换器并不是可以将用户提交的 String,转换为所有用户需要的类型.此时,就需要自定义类型转换器了. 例如,在 SpringMVC 的默认类型

struts2基础----&gt;自定义类型转换器

这一章,我们开始struts2中自定义类型转换器的学习. 自定义类型转换器 一.定义一个继承于StrutsTypeConverter的转换类: package com.huhx.converter; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import o

Struts2之类型转换器

一.类型转换器的应用场景 类型转换是OGNL的一部分,默认的八种基本类型.String.Date会使用类型转换,但是更复杂的类型转换就需要我们自定义了(虽然这个东西一般根本用不到),OGNL可以应用在很多领域,但是在web领域,因为在客户端到服务器端传输的只是字符串,所以这里就有一个需求收缩,我们的需求就变为完成String和复杂对象之间的互相转换.在Struts2中的类型转换则是在客户端的请求参数往Action的成员属性中设置的时候会被调用. 二.如何使用? 1.理论部分 所有的类型转换器都要