| 類型 | 繼承基底 | 特點 | 適用場景 | 範例 |
|---|---|---|---|---|
| 複合控制項 (Composite / User Control) |
`UserControl` | • 封裝**多個現有控制項**於容器內 • 包含所有子控制項固有功能 • 可選擇性公開/繫結子控制項屬性 • 內建大量鍵盤處理 (Tab/Enter 導航) • 開發最快、維護最易 |
• 表單區塊重用 (地址輸入、查詢面板) • 儀表板組件 • 需快速組合現有控制項 |
登入面板、分頁簽頁內容、資料輸入卡片 |
| 擴展控制項 (Extended / Derived) |
現有控制項 (`Button`, `TextBox`, `DataGridView`...) |
• 繼承現有控制項**保留所有原生功能** • **新增/修改屬性、方法、事件** • 可**重寫 `OnPaint` 改變外觀** • 單一職責擴充,輕量 |
• 需在標準控制項基礎上加業務邏輯 • 客製化外觀 (圓角按鈕、帶水印 TextBox) • 加入驗證、格式化、資料繫結輔助 |
NumericTextBox、ColorButton、AutoCompleteComboBox |
| 自訂控制項 (Custom / Owner-Drawn) |
`Control` | • **從零開始**繪製整個視覺樹 • `Control` 僅提供基礎:訊息迴圈、滑鼠/鍵盤事件、無邊框/背景/內容 • **必須完整實作 `OnPaint`** 繪製邏輯 • 完全掌控外觀與行為,開發成本最高 |
• 高度客製化視覺 (圖表、儀表、遊戲面板) • 標準控制項無法達成的交互模型 • 效能關鍵、無標準對應物 |
股票K線圖、圓形進度條、迷你地圖控制項 |
需要 UI 介面嗎?
├─ 否 → 開發 Component (Timer, Service, Repository...)
└─ 是 → 能用現有控制項組合完成嗎?
├─ 是 → 繼承 UserControl (複合控制項) ⭐ 首選
└─ 否 → 需修改現有控制項外觀/行為嗎?
├─ 是 → 繼承該控制項 (擴展控制項) ⭐ 次選
└─ 否 → 需從零繪製完全自訂外觀嗎?
├─ 是 → 繼承 Control (自訂控制項) 🛠 最後手段
└─ 否 → 重新評估需求
| 面向 | 複合控制項 | 擴展控制項 | 自訂控制項 |
|---|---|---|---|
| 設計器支援 | ✅ 完整 (拖拉子控制項) | ✅ 部分 (屬性視窗) | ⚠️ 僅屬性/事件,無視覺設計 |
| 程式碼量 | 少 (組合+委派) | 中 (覆寫+新增) | 大 (全繪製+擊測+輸入處理) |
| 效能 | 標準 (子控制項開銷) | 接近原生 | 最高 (單一繪製呼叫) |
| 鍵盤/無障礙 | 內建完善 | 繼承原生 | **需自行實作** (TabStop, Focus, WM_GETDLGCODE...) |
| 測試難度 | 低 (單元測試邏輯) | 中 | 高 (視覺回歸測試) |
**元件 ≠ 控制項**,控制項是「有 UI 的元件」。WinForms 三大控制項類型:**複合 (UserControl) > 擴展 (Derived) > 自訂 (Control)**,按**開發成本、維護性、功能完整度**遞減排序。**能用複合就別用擴展,能用擴展就別用自訂**——這是降低技術債、提升交付品質的鐵律。