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);

}

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

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

posted @ 2020-02-12 20:35  Min.Xiaoshuang  阅读(1790)  评论(0编辑  收藏  举报