在WPF中自訂控制項(1):概述
周銀輝
一, 不一定需要自訂控制項
在使用WPF以前,動輒使用自訂控制項幾乎成了慣性思維,比如需要一個帶圖片的按鈕,但在WPF中此類任務卻不需要如此大費周章,因為控制項可以嵌套使用以及可以為控制面板打造一套新的樣式就可以了.是否需要我們來自訂控制項,這需要你考慮目前已有控制項的真正邏輯功能而不要局限於外觀,如果目前的控制項都不能直覺地表達你的想法,那麼你可以自己來打造一個控制項,否則,也許我們僅僅改變一下目前控制項的模板等就可以完成任務.很多人在自訂控制項上經常犯的錯誤是:重複撰寫已有的邏輯
二,UserControl還是CustomControl?
要在WPF中自訂一個控制項,使用UserControl與CustomControl都是不錯的選擇(除此之外,還有更多選擇,比如打造一個自訂的面板,但這不在本文的討論範圍),他們的區別在於:
UserControl,其更像WinForm中自訂控制項的開發風格,在開發上更簡單快速,幾乎可以簡單地理解為:利用設計器來將多個已有控制項作為子項目來拼湊成一個UserControl並修改其外觀,然後後台邏輯代碼直接存取這些子項目.其最大的弊端在於:其對模板樣式等支援度不好,其重複使用的範圍有限.
CustomControl, 其開發出來的控制項才真正具有WPF風格,其對模板樣式有著很好的支援,這是因為打造CustomControl時做到了邏輯代碼與外觀相分離,即使換上一套完全不同的視覺樹其同樣能很好的工作,就像WPF內建的控制項一樣.
在使用Visual Studio打造控制項時,UserControl與CustomControl的差別就更加明顯,在項目中添加一個UserControl時,我們會發現設計器為我們添加了一個XAML檔案以及一個對應的.CS檔案(或.VB等),然後你就可以像設計普通表單一樣設計該UserControl; 如果我們是在項目中添加一個CustomControl,情況卻不是這樣,設計器會為我們產生一個.CS檔案(或.VB等),該檔案用於編寫控制項的後台邏輯,而控制項的外觀卻定義在了軟體的應用主題(Theme)中了(如果你沒有為軟體定義程式通用主題,其會自動產生一個通用主題themes\generic.xaml, 然後主題中會自動為你的控制項產生一個Style),並將通用主題與該控制項關聯了起來.這也就是CustomControl對樣式的支援度比UserControl好的原因.
三,繼承於UserContorl,Control還是其它?
如果你準備打造一個控制項,並使用像Visual Studio這樣的工具來開發的話,打造UserControl時其會自動為你從System.Windows.Controls.UserControl繼承,打造CustomControl時其會為從System.Windows.Controls.Control繼承.但實際情況下,也許我們從他們的衍生類別開始繼承會得到更多的好處(更好的重用已有的邏輯),比如你的控制項擁有更多的類似於Button的某些特性,那麼從Button開始繼承就比從Control繼承少寫很多代碼.
在接下來的幾節中,我們會逐步討論如何打造UserControl與CustomControl以及讓它們更好支援WPF新特性.