所有自訂元素的共同祖先:FrameworkElement
無論選哪個基類,最終都會直接或間接繼承 FrameworkElement,獲得路由事件、進階屬性系統、動畫、資料繫結、樣式、邏輯樹整合等核心服務。直接繼承 Visual 雖可用底層繪圖 API,但會失去所有 FrameworkElement 服務,僅適合極特殊專業場景。
常見基類決策樹

直接繼承 FrameworkElement
- 適用:設計為組合進其他元素的獨立視覺元件(如資料圖表繪製元素)。
- 不提供控制項功能(無 Template、無 Focus、無滑鼠互動)。
繼承 Panel
- 適用:自訂版面配置邏輯(如流式、放射狀、自動換行等特殊排列)。
- 需覆寫
MeasureOverride、ArrangeOverride。
繼承 Decorator
- 適用:單一子元素的包裝器,在內容四周加裝裝飾或效果。
- 內建範例:
Border(加框線)、Viewbox(自動縮放填滿)。
- 若你要寫一個「在內容外加功能」的包裝器,考慮 Decorator。
繼承 Control——提供行為與使用者互動
- 適用:元素需支援焦點、滑鼠/鍵盤互動、Template 替換外觀。
- 若行為無法用現有控制項組合達成,才繼承 Control。
Control 的進階派生類
| 基類 | 適用場景 |
ContentControl | 單一內容區域(如按鈕、標籤、ToolTip),支援內容模型與 ContentPresenter。 |
HeaderedContentControl | 有標題區與主內容區(如 TabItem、GroupBox)。 |
ItemsControl | 呈現多個子項目(清單、選單、樹狀)。優先考慮 ListBox + 資料繫結/樣式是否足夠。 |
Selector | 需追蹤單一或多重選取狀態的 ItemsControl(如 ListBox、ComboBox、TabControl)。 |
避免過度設計的提醒
- 若發現自己在寫自訂控制項卻把它塞進另一個控制項的 Template 內,請重新檢視基類選擇。
- 大量 WPF 彈性元素(Panel、Shape、Transform)繼承
FrameworkElement 而非 Control,不一定要是 Control 才有彈性。
選擇基類的決策流程
- 需要自訂版面配置?→
Panel
- 單一子元素包裝器?→
Decorator
- 需要互動行為(焦點、點擊、命令)?→
Control 或其派生類
- 單一內容?→
ContentControl / HeaderedContentControl
- 多項目集合?→
ItemsControl / Selector
- 純視覺繪製、無互動?→
FrameworkElement 或 Shape
- 上一篇文章: WPF 自訂控制項的 API 設計:相依性屬性、路由事件與命令實作全解析
- 下一篇文章: WPF 自訂控制項開發入門:從「真的需要嗎?」到基類選擇與 API 設計
Copyright ©
程式碼之家 All Rights Reserved