Visual Studio .NET 帶來了全新的受控元件開發模型:以管理代碼編寫、在 CLR 上運行、支援設計工具整合、與傳統 COM 元件無縫互通。開發者不再需為記憶體洩漏、指標運算、頭文件依賴煩惱,可專注於業務邏輯與元件架構設計。本文系統梳理從「建立基本元件」到「客製化設計階段中繼資料」的完整知識鏈。
.NET 元件的核心需求極簡單:實作 System.ComponentModel.IComponent 介面(通常透過繼承 Component 基類達成)。這使元件能:
using System;
using System.ComponentModel;
public class BoolTracker : Component
{
private bool state;
private EventHandler handler;
private static readonly object EventValueChanged = new object();
public BoolTracker() { }
public bool Value
{
get => state;
set
{
if (state != value)
{
state = value;
OnValueChanged(EventArgs.Empty);
}
}
}
public event EventHandler ValueChanged
{
add => handler = (EventHandler)Delegate.Combine(handler, value);
remove => handler = (EventHandler)Delegate.Remove(handler, value);
}
protected virtual void OnValueChanged(EventArgs e)
{
handler?.Invoke(this, e);
}
}
將此類別編譯為 DLL 並加入工具箱,拖曳至表單設計工具即可在屬性視窗看到 Value 屬性(布林下拉選單),且在 True/False 切換時觸發 ValueChanged 事件。
設計工具透過「反射」讀取類別、屬性、事件的基本中繼資料(型別、讀寫性、名稱)。但基本資訊不足以提供豐富的設計體驗,需透過 屬性 擴充自訂中繼資料。所有設計工具認可的屬性均衍生自 System.ComponentModel.Attribute。
| 屬性 | 用途 |
|---|---|
[Browsable(false)] | 隱藏屬性/事件不顯示在屬性視窗 |
[Category("Appearance")] | 指定屬性分組類別(如 Appearance、Layout、Behavior、Misc) |
[Description("說明文字")] | 屬性視窗底部顯示的說明 |
[DefaultValue(true)] | 指定預設值,屬性視窗會以粗體顯示非預設值 |
[Editor(typeof(MyEditor), typeof(UITypeEditor))] | 自訂屬性編輯器(如下拉色盤、檔案選擇器) |
[TypeConverter(typeof(MyConverter))] | 自訂型別轉換器(字串↔物件) |
[DesignerSerializationVisibility(Content)] | 控制序列化行為(Content/Visible/Hidden) |
[ParenthesizePropertyName(true)] | 屬性名加括號,表示進階屬性 |
[ReadOnly(true)] | 屬性唯讀於設計階段 |
[Bindable(true)] | 標記屬性支援資料繫結 |
[LicenseProvider(typeof(MyProvider))] | 指定授權提供者 |
[Browsable(false)]
public bool Value
{
get => state;
set { /* ... */ }
}
加上 [Browsable(false)] 後,屬性視窗將不再列出 Value,但程式碼仍可正常存取。屬性名可省略 Attribute 後綴(編譯器自動補全)。
繼承 System.ComponentModel.Design.ComponentDesigner 或 ControlDesigner,可:
PreFilterProperties/PostFilterProperties)DesignerActionList,VS 2005+ 智慧標籤)繼承 TypeConverter,實作 CanConvertFrom/To、ConvertFrom/To,支援屬性視窗中字串與複雜物件雙向轉換(如 ColorConverter、PointConverter)。
繼承 UITypeEditor,設定 EditStyle 為 Modal/DropDown,在 EditValue 中彈出自訂對話框或下拉面板(如檔案選擇、顏色選取、資料庫連線字串建構器)。
實作 LicenseProvider,在 GetLicense 中驗證授權金鑰,保護商業元件知識產權。
[Category]、[Description]、[DefaultValue]EventName + EventHandler 模式,並提供 add/remove 存取器[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 確保子屬性被序列化Embedded ResourceC# 元件開發的核心在於「受控代碼」與「設計階段中繼資料」的雙重掌握。從繼承 Component 開始,透過屬性裝飾暴露豐富設計資訊,再進階至自訂設計工具、型別轉換器、編輯器,即可打造出與 .NET Framework 內建元件體驗一致的專業級元件庫。這正是 VS.NET 設計工具架構賦予開發者的極致擴充能力。