艾伟:WinForm控件开发总结(六)-----控件属性类型转换器代码详解

简介: 在上一篇文章,我为控件添加一个一个复杂属性,并且为这个属性的类型的编写了一个类型转换器,现在我们来看看这个类型转换器的代码,并解释一下这些代码的意义。       要实现一个类型转换器,我们必须要重写(override)四个方法:       CanConvertFrom()――根据类型参数进行测试,判断是否能从这个类型转换成当前类型,在本例中我们只提供转换string和InstanceDescriptor类型的能力。

      在上一篇文章,我为控件添加一个一个复杂属性,并且为这个属性的类型的编写了一个类型转换器,现在我们来看看这个类型转换器的代码,并解释一下这些代码的意义。
       要实现一个类型转换器,我们必须要重写(override)四个方法:
       CanConvertFrom()――根据类型参数进行测试,判断是否能从这个类型转换成当前类型,在本例中我们只提供转换string和InstanceDescriptor类型的能力。
       CanConvertTo()――根据类型参数进行测试,判断是否能从当前类型转换成指定的类型。
       ConvertTo()――将参数value的值转换为指定的类型。
       ConvertFrom()――串换参数value,并返回但书类型的一个对象。
      

  public   override   object  ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture,  object  value, Type destinationType)
        
{
            String result 
=   "" ;
            
if  (destinationType  ==   typeof (String))
            
{
                Scope scope 
=  (Scope)value;
                result 
=  scope.Min.ToString() + " , "   +  scope.Max.ToString();
                
return  result;

            }


            
if  (destinationType  ==   typeof (InstanceDescriptor))
            
{
                ConstructorInfo ci 
=   typeof (Scope).GetConstructor( new  Type[]  { typeof (Int32),
typeof
(Int32) } );
                Scope scope 
=  (Scope)value;
                
return   new  InstanceDescriptor(ci,  new   object []  { scope.Min,scope.Max } );
            }

            
return   base .ConvertTo(context, culture, value, destinationType);
        }


          上面是 ConvertTo 的实现,如果转换的目标类型是 string ,我将 Scope 的两个属性转换成 string 类型,并且用一个“,”连接起来,这就是我们在属性浏览器里看到的表现形式,如图:
      
      如果转换的目标类型是实例描述器(InstanceDescriptor,它负责生成实例化的代码),我们需要构造一个实例描述器,构造实例描述器的时候,我们要利用反射机制获得Scope类的构造器信息,并在new的时候传入Scope实例的两个属性值。实例描述器会为我们生成这样的代码:
this.myListControl1.Scope = new CustomControlSample.Scope(10, 200);在最后不要忘记调用 base.ConvertTo(context, culture, value, destinationType),你不需要处理的转换类型,交给基类去做好了。
      
public   override   object  ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture,  object  value)
        
{
            
if  (value  is   string )
            
{
                String[] v 
=  ((String)value).Split( ' , ' );
                
if  (v.GetLength( 0 !=   2 )
                
{
                    
throw   new  ArgumentException( " Invalid parameter format " );
                }


                Scope csf 
=   new  Scope();
                csf.Min 
=  Convert.ToInt32(v[ 0 ]);
                csf.Max 
=  Convert.ToInt32(v[ 1 ]);
                
return  csf;
            }

            
return   base .ConvertFrom(context, culture, value);
        }

    }

      上面是ConvertFrom的代码,由于系统能够直接将实例描述器转换为Scope类型,所以我们就没有必要再写代码,我们只需要关注如何将String(在属性浏览出现的属性值的表达)类型的值转换为Scope类型。没有很复杂的转换,只是将这个字符串以“,”分拆开,并串换为Int32类型,然后new一个Scope类的实例,将分拆后转换的两个整型值赋给Scope的实例,然后返回实例。在这段代码里,我们要判断一下用户设定的属性值是否有效。比如,如果用户在Scope属性那里输入了“10200”,由于没有输入“,”,我们无法将属性的值分拆为两个字符串,也就无法进行下面的转换,所以,我们要抛出一个异常,通知用户重新输入。    
目录
相关文章
|
消息中间件 BI C#
C#中常见的winform控件命名规范
C#中常见的winform控件命名规范
409 0
|
前端开发 C# 图形学
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
Wpf开发过程中,最经常使用的功能之一,就是用户控件(UserControl)了。用户控件可以用于开发用户自己的控件进行使用,甚至可以用于打造一套属于自己的UI框架。依赖属性(DependencyProperty)是为用户控件提供可支持双向绑定的必备技巧之一,同样用处也非常广泛。
967 0
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
|
机器学习/深度学习 数据可视化 程序员
WinForm控件属性大全
WinForm控件属性大全
452 0
|
XML 程序员 C语言
Qt编写控件属性设计器2-拖曳控件
一、前言 上一篇文章把插件加载好了,并且把插件中的所有控件都显示到了列表框中,这次要做的就是实现拖曳控件的功能,用户选择一个控件拖曳到画布上,松开,在松开位置处自动实例化该控件,这个需要用到dropEvent和dragEnterEvent事件,重新实现这两个事件,对拖曳的对象进行过滤并调用函数实例化该控件,在实例化该控件的同时实例化控件跟随控件以便拉伸调整大小和位置。
921 0
Qt编写自定义控件30-颜色多态按钮
一、前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得当时接到这个定制控件任务的时候是2016年,那时候对QPainter的使用还不是很熟悉,也就是从此控件开始,逐步研究QPainter的绘制,把所有的内置函数都使用一遍,最终用的越来越熟悉,使得后来到了心中有坐标,万物皆painter的境界,可能就像武林中所说的打通了任督二脉吧。
1187 0
|
开发工具 C语言
Qt编写自定义控件13-多态进度条
一、前言 多态进度条,顾名思义,有多重状态,其实本控件主要是用来表示百分比进度的,由于之前已经存在了百分比进度条控件,名字被霸占了,按照先来先得原则,只好另外取个别名叫做多态进度条,应用场景是,某种任务有三种状态,比如正常状态、警戒状态、报警状态,这三种状态都分别有一个占比,需要用不同的颜色表示,这样就衍生出了此控件,类似于堆积图。
1049 0
|
Web App开发
艾伟:WinForm控件开发总结(五)-----为控件的复杂属性提供类型转换器
上一篇文章我已经介绍了TypeConverterAttribute元数据的作用,本文将通过代码向你展示具体的实现。在这个例子中,我要给控件添加一个复杂的属性,这个属性对这个控件没有什么功用,纯粹是为了演示,有些牵强附会了。
824 0
|
Web App开发
艾伟:WinForm控件开发总结(三)------认识WinForm控件常用的Attribute
在前面的文章里我们制作了一个非常简单的控件。现在我们回过头来看看这些代码透露出什么信息。   这个类是直接从Control类派生出来的,自定义控件都是直接从Control类派生出来的。这个类定义了一个属性TextAlignment,用来控制文本在控件中显示的位置:           ...
1020 0
|
Web App开发
艾伟:WinForm控件开发总结(四)-----控件属性的串行化
前一篇文章介绍了常用的设计时Attribute。其中BrowsableAttribute,CategoryAttribute,DescriptionAttribute,DefaultPropertyAttribute,DefaultEventAttribute都是比较简单的,也是可有可无,但是为了提供更好的用户体验这些Attribute最好不要省掉,如果你对这些Attribute还不熟悉,可以参考我前一篇文章的描述或者查看MSDN,这里我就不在赘述了。
964 0