首页 > 其他分享 >WPF中的TypeConverter类型

WPF中的TypeConverter类型

时间:2024-12-02 11:33:05浏览次数:5  
标签:string 代码 Human 类型 TypeConverter WPF public

自定义对象如下:

点击查看代码
    public class Human
    {
        public string Name { get; set; }

        public Human Child { get; set; }
    }

需求1:点击界面上Button时弹出Human对象的Name信息

代码实现:

点击查看代码
<Window x:Class="HappyWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:HappyWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>
        <!--Button被点击后要显示的对象Human-->
        <local:Human x:Key="human" Name="Tim"/>
    </Window.Resources>
    
    <Grid> 
        <Button  Content="Show" Width="200" Height="50" Click="Button_Click"/>
    </Grid>
</Window>

Button事件代码:

点击查看代码
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Human h = this.FindResource("human") as Human;
            if (h != null)
            {
                MessageBox.Show(h.Child.Name);
            }
        }

需求2:点击界面上Button时弹出Human对象的Child的Name信息
前台代码修改如下:

点击查看代码
<Window x:Class="HappyWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:HappyWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>
        <!--给对象Human的Child赋值-->
        <local:Human x:Key="human" Name="Tim" Child="LittleTim"/>
    </Window.Resources>
    
    <Grid>
        
        <Button  Content="Show" Width="200" Height="50" Click="Button_Click"/>
    </Grid>
</Window>

直接运行会报错,原因是在xaml文件中Child="LittleTim"我们将string类型赋值给Child了,

但Child是Human类型,现在的代码无法将string转换成Human类型 。

对于这个问题,WPF给我们提供了一个TypeConverter类型。

TypeConverter位于System.ComponentModel命名空间中。

TypeConverter允许我们定义如何从字符串转换到特定的类型,以及如何将特定类型转换会String。 

1‌、从string转换到类型‌:当XAML解析器遇到需要设置为非字符串类型的属性时,它会使用TypeConverter将字符串值转换为所需的类型。

‌2、从类型转换到string:在某些情况下,可能需要将类型的值转换为字符串表示,例如在属性编辑器中显示值。



使用TypeConverter通常需要执行以下步骤:

1、创建自定义的TypeConverter:

* 继承自 TypeConverter 类。

* 重写 CanConvertFrom 方法来指定可以从哪些类型转换。

* 重写 CanConvertTo 方法来指定可以转换到哪些类型。

* 重写 ConvertFrom 方法来实现从其他类型到目标类型的转换。

* 重写 ConvertTo 方法来实现从目标类型到其他类型的转换。

2、应用TypeConverter:

* 在xaml中,使用 x:TypeArguments属性指定要转换的类型(如果TypeConverter是泛型的)。

* 在代码中,可以直接使用TypeConverter类进行转换。

3、在xaml中使用TypeConverterAttribute(可选):

* 如果我们希望在xaml中自动使用自己TypeConverter,可以在目标类型或属性上应用TypeConverterAttribute。

现在我们继续修改代码来实现需求2

继承TypeConverter类来定义我们自己的转换类:

点击查看代码
    public class NameToHumanTypeConverter : TypeConverter
    {
        public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
        {
            if (value is string name)
            {
                Human child = new Human()
                {
                    Name = name
                };
                return child;
            }
            return base.ConvertFrom(context, culture, value);
        }
    }

给Human类型添加上标签,转换使用的是NameToHumanTypeConverter类型的转换器

点击查看代码
    // 在Human上应用TypeConverterAttribute以指定转换器
    [TypeConverterAttribute(typeof(NameToHumanTypeConverter))]
    public class Human
    {
        public string Name { get; set; }

        public Human Child { get; set; }
    }
现在运行程序就可以实现需求效果了。

标签:string,代码,Human,类型,TypeConverter,WPF,public
From: https://www.cnblogs.com/zeoHere/p/18581361

相关文章

  • 支持30+种类型幻灯片 | 轮播图 | 旋转木马的强大jQuery插件
    jssorslider是一款功能非常强大的可制作超过30种不同类型的幻灯片|轮播图|旋转木马的JQUERY插件。jssor具有高性能,轻量级,跨浏览器等特点,它可以支持IE6+的浏览器,并且可以支持移动触摸设备。它的特点还有:轻量级,压缩版本只有17KB大小。高性能,通过消耗很少的CPU来完成平滑过渡效果......
  • python - 基础数据类型
    基础数据类型基础数据类型空值(none)整数(int):表示整数,例如x=2。浮点数(float):表示带有小数点的数值,例如y=1.23。复数(complex):包含实部和虚部的数值,例如z=4+4j。布尔值(bool):表示真(True)或假(False),例如is_true=True。字符串(str):表示文本数据,例如text="Welcome,......
  • 界面控件DevExpress WPF v24.2新功能预览 - 人工智能(AI)集成
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • task 03 数据类型和操作
    task03数据类型和操作想要掌握一门语言,了解基础的操作必不可少常用内置类型这些内容在c语言中也很常见,但在python中有一些不同,并且在python中有很多高度整合的数据类型,这在c语言中是需要复杂的操作去实现的整形(int)浮点型(float)布尔值(bool)在c语言中是1或0,在python中更为......
  • 百度的面试官,你什么勾八水平,也好意思上车锁门 面试官:说一下C++强制类型转换,C++内存管
    ......
  • 多线程篇-5--线程分类(线程类型,springboot中常见线程类型,异步任务线程)
    常见的线程类型包括用户线程(UserThreads)、守护线程(DaemonThreads)、主线程(MainThread)、工作线程(WorkerThreads)和线程池中的线程。一、用户线程(UserThreads)特点:用户线程是普通的Java线程,通常由程序员显式创建。用户线程在程序运行期间一直存在,直到它们完成任务或程序......
  • 类型转换
    一、自动类型转换1.容量由小到大变化:byte-short-int-long-double-float-double或char-int-long-double-float-doubleintn1=10;//ok//floatd1=n1+1.1;//错误n1+1.1=>结果类型是double//doubled1=n1+1.1;//对n1+1.1=>结果类型是doublefloatd1=n......
  • Python入门基础语法之运算符类型和语法
    运算符类型和语法运算符基本概念需注意,虽然python中无常量,但人为规定,在运行过程中值不能改变的为常量,要全部大写。操作数:参与运算的变量或者常量或具体的数值操作符:将参与运算的量连接起来的符号表达式:由操作数和操作符构成且符合python语法规范的式子,不同的操作符可以......
  • SSRF(Server-Side Request Forgery),即服务器端请求伪造,是一种网络安全攻击类型。在 SSRF
    什么是SSRF(Server-SideRequestForgery)?SSRF(Server-SideRequestForgery),即服务器端请求伪造,是一种网络安全攻击类型。在SSRF攻击中,攻击者通过欺骗受害者服务器,使其发起请求到攻击者指定的内部或外部资源。这种请求通常是通过目标服务器的HTTP客户端、API或其他网络请求功......
  • C++类的自动转换和强制类型转换
    目录一、类型转换     二、转换函数一、类型转换             C++⽀持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数        简单说就是可以将内置类型转化为自定义类型    示例:classTest......