• PropertyGrid使用总结4 IcustomTypeDescriptor


    前面章节说明了一个重要的类TypeConverter,有些对象需要提供自定义的描述的时候,TypeConverter可能就不满足,在那些情况下,需要实现自定义的描述呢, 比如以下需求:

    1. 当对象需要动态类型信息时,需要自描述的时候。
    2. COM 对象的类型信息,COM 对象不支持属性或属性,需要使用IcustomTypeDescriptor类封装。

    本章我们根据这两个需求,分别介绍当前接口的应用。

    为了实现对象可以当组件一样使用,我让类继承了Component类,代码如下:

    using System;
    
    using System.Collections.Generic;
    
    using System.ComponentModel;
    
    using System.Linq;
    
    using System.Text;
    
    using System.Threading.Tasks;
    
    using System.Windows.Forms;
    
     
    
    namespace AlbertControlExample.Controls
    
    {
    
    /// <summary>
    
    /// 定义一个组件
    
    /// </summary>
    
    public class CustomDef : Component, ICustomTypeDescriptor
    
    {
    
    public CustomDef()
    
    {
    
    Left = 0;
    
    Top = 0;
    
    }
    
    public CustomDef(int left, int top)
    
    {
    
    this.Left = left;
    
    this.Top = top;
    
    }
    
    public double Left { get; set; }
    
    public double Top { get; set; }
    
     
    
    /// <summary>
    
    /// 获取当前attributes集合
    
    /// </summary>
    
    /// <returns></returns>
    
    public AttributeCollection GetAttributes()
    
    {
    
    return TypeDescriptor.GetAttributes(this, true);
    
    }
    
     
    
    public string GetClassName()
    
    {
    
    return "类名称";
    
    }
    
     
    
    public string GetComponentName()
    
    {
    
    return "组件名称";
    
    }
    
     
    
    /// <summary>
    
    /// 当前对象的TypeConverter
    
    /// </summary>
    
    /// <returns></returns>
    
    public TypeConverter GetConverter()
    
    {
    
    return TypeDescriptor.GetConverter(this, true);
    
    }
    
    /// <summary>
    
    /// 返回当前的事件描述器
    
    /// </summary>
    
    /// <returns></returns>
    
    public EventDescriptor GetDefaultEvent()
    
    {
    
    return TypeDescriptor.GetDefaultEvent(this, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的默认属性
    
    /// </summary>
    
    /// <returns></returns>
    
    public PropertyDescriptor GetDefaultProperty()
    
    {
    
    return TypeDescriptor.GetDefaultProperty(this, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的编辑器
    
    /// </summary>
    
    /// <param name="editorBaseType"></param>
    
    /// <returns></returns>
    
    public object GetEditor(Type editorBaseType)
    
    {
    
    return TypeDescriptor.GetEditor(this, editorBaseType, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的事件集合
    
    /// </summary>
    
    /// <returns></returns>
    
    public EventDescriptorCollection GetEvents()
    
    {
    
    return TypeDescriptor.GetEvents(this, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的事件描述集合
    
    /// </summary>
    
    /// <param name="attributes"></param>
    
    /// <returns></returns>
    
    public EventDescriptorCollection GetEvents(Attribute[] attributes)
    
    {
    
    return TypeDescriptor.GetEvents(this, attributes, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的属性集合
    
    /// </summary>
    
    /// <returns></returns>
    
    public PropertyDescriptorCollection GetProperties()
    
    {
    
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this, true);
    
     
    
    return properties;
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的属性描述集合
    
    /// </summary>
    
    /// <param name="attributes"></param>
    
    /// <returns></returns>
    
    public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    
    {
    
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this, attributes, true);
    
    return properties;
    
    }
    
    
    /// <summary>
    
    /// 返回当前属性的宿主
    
    /// </summary>
    
    /// <param name="pd"></param>
    
    /// <returns></returns>
    
    public object GetPropertyOwner(PropertyDescriptor pd)
    
    {
    
    return this;
    
    }
    
    }
    
    }

    我们分别说明每个函数的作用和意义。

    1、显示一些名称

    public string GetClassName()
    
    {
    
    return "类名称";
    
    }
    
     
    
    public string GetComponentName()
    
    {
    
    return "组件名称";
    
    }

    这两个主要用于显示的目的,如图

    2、默认属性的默认事件

    /// <summary>
    
    /// 返回当前的默认事件
    
    /// </summary>
    
    /// <returns></returns>
    
    public EventDescriptor GetDefaultEvent()
    
    {
    
    return TypeDescriptor.GetDefaultEvent(this, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的默认属性
    
    /// </summary>
    
    /// <returns></returns>
    
    public PropertyDescriptor GetDefaultProperty()
    
    {
    
    PropertyDescriptor propertyDescriptor = TypeDescriptor.CreateProperty(typeof(CustomDef),"Left",typeof(double));
    
    return propertyDescriptor;
    
    }

    这两个函数很特殊,其实就是显示默认的属性和双击控件默认的生成事件,如下图,优先显示的属性

    3、当前的属性集合和事件集合

    /// <summary>
    
    /// 返回当前的事件集合
    
    /// </summary>
    
    /// <returns></returns>
    
    public EventDescriptorCollection GetEvents()
    
    {
    
    return TypeDescriptor.GetEvents(this, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的事件描述集合
    
    /// </summary>
    
    /// <param name="attributes"></param>
    
    /// <returns></returns>
    
    public EventDescriptorCollection GetEvents(Attribute[] attributes)
    
    {
    
    return TypeDescriptor.GetEvents(this, attributes, true);
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的属性集合
    
    /// </summary>
    
    /// <returns></returns>
    
    public PropertyDescriptorCollection GetProperties()
    
    {
    
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this, true);
    
     
    
    return properties;
    
    }
    
     
    
    /// <summary>
    
    /// 返回当前的属性描述集合
    
    /// </summary>
    
    /// <param name="attributes"></param>
    
    /// <returns></returns>
    
    public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    
    {
    
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this, attributes, true);
    
     
    
    return properties;
    
    }
    
     

    4、编辑器对象

    用于获取当前的对象的属性列表和事件列表,也就是我们所有显示的列表对象

    /// <summary>
    
    /// 返回当前的编辑器
    
    /// </summary>
    
    /// <param name="editorBaseType"></param>
    
    /// <returns></returns>
    
    public object GetEditor(Type editorBaseType)
    
    {
    
    return TypeDescriptor.GetEditor(this, editorBaseType, true);
    
    }

    用于获取当前的类型编辑器,这个在下一章会详细介绍。

    其他函数,比较简单,很容易理解。

  • 相关阅读:
    STM32 Cube之旅-尝试新的开发方式
    FOC 电流采样为什么不准?你忽略了这个细节
    STM32 外部中断详解(原理+配置代码)
    STM32 TIM高级定时器死区时间的计算
    【STM32系列汇总】小白博主的STM32实战快速进阶之路(持续更新)
    FOC 算法基础之欧拉公式
    一阶RC高通滤波器详解(仿真+matlab+C语言实现)
    一阶RC低通滤波器详解(仿真+matlab+C语言实现)
    matlab 调用C程序进行simulink仿真
    matlab 提示 Error using mex No supported compiler or SDK was found 错误的解决办法
  • 原文地址:https://www.cnblogs.com/minhost/p/12300751.html
Copyright © 2020-2023  润新知