只有當現有內建控制項都無法提供你所需的底層行為時,才應該動手寫自訂控制項。這是 WPF 靈活的組合與模板機制無法滿足時的最後手段。
RoutedCommand 與 CommandBinding 實現輸入手勢與行為的分離。若想像內建控制項一樣擁有可替換的外觀,必須將控制項設計為「無外觀」(Lookless),並提供預設 ControlTemplate。控制項與模板之間的協定包括:
TemplateBinding 連結控制項的相依性屬性。ContentPresenter、ItemsPresenter 或自訂附屬屬性標記的元素,讓控制項在模板中尋找必要的視覺部件。預設樣式置於專案的 Themes/generic.xaml(Build Action 設為 Resource),並在靜態建構式中覆寫 ThemeStyleKeyProperty 中繼資料,指向自身型別,確保控制項自動套用預設樣式。
掌握這些概念,你就能打造出擁有內建控制項級別彈性與重用性的自訂控制項。