艾伟: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”,由于没有输入“,”,我们无法将属性的值分拆为两个字符串,也就无法进行下面的转换,所以,我们要抛出一个异常,通知用户重新输入。    
目录
相关文章
|
XML 开发框架 .NET
【牛刀小试】——Repeater控件常见错误及几种相似控件的区别
【牛刀小试】——Repeater控件常见错误及几种相似控件的区别
154 0
【牛刀小试】——Repeater控件常见错误及几种相似控件的区别
|
Web App开发
艾伟:WinForm控件开发总结(五)-----为控件的复杂属性提供类型转换器
上一篇文章我已经介绍了TypeConverterAttribute元数据的作用,本文将通过代码向你展示具体的实现。在这个例子中,我要给控件添加一个复杂的属性,这个属性对这个控件没有什么功用,纯粹是为了演示,有些牵强附会了。
805 0
|
C#
艾伟_转载:WPF/Silverlight陷阱:XAML自定义控件的嵌套内容无法通过名称访问
为了说明这个问题,假定我们需要实现一个具有特殊功能的按钮控件。编写Xaml文件如下: Button> 对 Code Behind类,唯一的改动是把向导生成的基类从UserControl改成Button: public partial class XamlButton : Button{    ...
1060 0
|
Web App开发
艾伟:WinForm控件开发总结(三)------认识WinForm控件常用的Attribute
在前面的文章里我们制作了一个非常简单的控件。现在我们回过头来看看这些代码透露出什么信息。   这个类是直接从Control类派生出来的,自定义控件都是直接从Control类派生出来的。这个类定义了一个属性TextAlignment,用来控制文本在控件中显示的位置:           ...
993 0
|
Web App开发
艾伟:WinForm控件开发总结(四)-----控件属性的串行化
前一篇文章介绍了常用的设计时Attribute。其中BrowsableAttribute,CategoryAttribute,DescriptionAttribute,DefaultPropertyAttribute,DefaultEventAttribute都是比较简单的,也是可有可无,但是为了提供更好的用户体验这些Attribute最好不要省掉,如果你对这些Attribute还不熟悉,可以参考我前一篇文章的描述或者查看MSDN,这里我就不在赘述了。
944 0
|
测试技术
艾伟:WinForm控件开发总结(二)------使用和调试自定义控件
在上一篇文章里我们创建了一个简单的控件FirstControl,现在我来介绍一下怎么使用和调试自己的控件。我希望将过程写的尽可能的详细,让想学习控件开发的朋友容易上手,高手们见谅。       在同一个solution里添加一个Windows Application工程(在Solution Explorer里右键点击CustomControlSample solution选择Add->New Project…),命名为TestControl。
875 0
|
C#
WPF设计の自定义窗体
原文:WPF设计の自定义窗体   效果图如下:     实现思路:  1.继承Window类 2.为自定义的CustomWindow类设计窗体样式(使用Blend很方便!) 3.为窗体增加最大最小化和关闭按钮,并实现鼠标拖拽改变窗体大小(使用Derek Bartram的WindowResizer.
1025 0
|
C# 前端开发
WPF Adorner+附加属性 实现控件友好提示
原文:WPF Adorner+附加属性 实现控件友好提示 标题太空泛,直接上图   无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成。
973 0
|
JavaScript 前端开发 C++
COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
声明:本文代码基于CodeProject的文章《A Complete ActiveX Web Control Tutorial》修改而来,因此同样遵循Code Project Open License (CPOL)。
849 0