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

}

用於獲取當前的類型編輯器,這個在下一章會詳細介紹。

其他函數,比較簡單,很容易理解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM