儘管可在任意WPF項目中編寫自定義元素,但通常希望在專門的類庫程式集(DLL)中放置自定義元素。這樣,可在多個WPF應用程式之間共用自定義元素。 為確保具有正確的程式集引用和名稱空間導入,當在Visual Studio中創建應用程式時,應當選擇Custom Control Library(WPF)項 ...
儘管可在任意WPF項目中編寫自定義元素,但通常希望在專門的類庫程式集(DLL)中放置自定義元素。這樣,可在多個WPF應用程式之間共用自定義元素。
為確保具有正確的程式集引用和名稱空間導入,當在Visual Studio中創建應用程式時,應當選擇Custom Control Library(WPF)項目類型。在類庫中,可創建任意數量的控制項。
創建自定義控制項的第一步是選擇正確的基類進行繼承。下表列出了創建自定義控制項時一些常用的基類。
名 稱 | 說 明 |
FrameworkElement | 當創建自定義元素時,這是最常用的最低級的基類。通常,只有當希望重寫OnRender()方法並使用System.Windows.Media.DrawingContext從頭繪製內容時,才會使用這種方法。 |
Control | 當從頭開始創建控制項時,這是最常用的起點。該類是所有用戶交互小組件的基類。Control類添加了用於設置背景、前景、字體和內容對齊方式的屬性。控制項類還為自身設置了Tab順序(通過IsTabStop屬性),並且引入了滑鼠雙擊功能(通過MouseDoubleClick和PreviewMouseDoubleClick屬性)。但最重要的是,Control類定義了Template屬性,為了得到無限的靈活性。該屬性允許使用自定義元素樹替換其外觀。 |
ContentControl | 這是能夠顯示任意單一內容的控制項的基類。顯示的內容可以是元素或結合使用模板的自定義對象(內容通過Content屬性設置,並且可以通過ContentTemplate屬性提供可選的模板)。許多控制項都封裝了特定的、類型在一定範圍內的內容(例如,文本框中的文本字元串)。因此這些控制項不支持所有元素,所以不是內容控制項。 |
UserControl | 這是可使用設計視圖進行配置的內容控制項。儘管用戶控制項和普通的內容控制項是不同的,但當希望在多個視窗中快速重用用戶界面中的不變模塊時(而不是創建真正的能在不同應用程式之間轉移的獨立控制項),通常使用該基類 |
ItemControl或 Selector |
ItemsControl是封裝項列表的控制項的基類,但不支持選擇,而Selector類是支持選擇的控制項的更具體基類。創建自定義控制項不經常使用這些類,因為ListBox、ListView以及TreeView控制項的數據綁定特性提供了很大的靈活性 |
Panel | 該類是具有佈局邏輯控制項的基類。佈局控制項能夠包含多個子元素,並根據特定的佈局語義安排這些子元素。通常,面板提供了用於設置子元素的附加屬性,配置如何安排子元素 |
Decorator | 封裝其他元素的元素基類,並且提供了一種圖形效果或特定的功能。兩個明顯的例子是Border和ViewBox,其中Border控制項在元素的周圍繪製線條,ViewBox控制項使用變換動態縮放其內容。其他修飾元素包括為普通控制項(如按鈕)提供熟悉邊框和背景色的修飾類 |
特殊控制項類 | 如果希望改進現有控制項,可直接繼承該控制項。例如,可創建具有內置驗證邏輯的TextBox控制項。然而,在採取這一步之前,應當首先分析是否可通過事件處理代碼或單獨的組件達到同一目的。這兩種方法都可使自定義邏輯和控制項相分離,從而可在其他控制項中重用 |
接下來將看到一個用戶控制項,一個直接繼承自Contrl類的無外觀的顏色拾取器,一個使用可視化狀態的無外觀的的FlipPanel,一個自定義的佈局面板,以及一個繼承自FrameworkElement類並重寫了OnRender()方法的自繪製元素。