在寫一個自定義控件之前,你需要問的第一個問題是,我真的需要一個自定義控件嗎?一個寫自定義 控件的主要原因是為了用戶界面技術專家可以修改控件的外觀,但是正如我們在前些章看到的,內容模型 和模板意味著這通常是不必要的。WPF提供了一個先進的按照規模的定制技術,你應該記住這些——當考 慮寫一個自定義控件時。
使用屬性修改一個已有控件的外觀
組合已有的一些控件
將內容嵌入已有控件
使用模板代替一個已有控件
創建一個自定義控件或其他自定義元素
這個順序提供了漸增的能力級別,以每一級別上輕微的額外成效為交換。在這些簡單的情形中,你可 以通過設置屬性來調整一個內嵌控件的行為和外觀以滿足你對的需求。下一步是將控件編譯在一起,形成 一個更強大的整體。你可以通過將內容嵌入另一個控件的方式,把這個合成物帶入到下一步驟。你可以使 用一個模板完全替換外觀,正如第5章所描述的。一旦技術1-4都沒有滿足你的需求,編寫一個自定義的元 素就像自定義控件,看上去像是一個答案。
是否需要寫一個新的可視化元素類型,一個重要的指示是,你是否計劃添加一個新的API特性。即使在 這種情形,你應該仔細的考慮要寫哪一種自定義元素類型,控件並不是唯一的元素種類。通過寫一個底層 的組件,並集成到已知控件中的外觀中,你可以得到更多的彈性。例如,大量的使WPF彈性化的元素,如 布局類和Shapes,派生於FrameworkElement,實際上並不是控件——它們不是從Control基類派生的。
如果你確定一個自定義元素使最好的進行辦法,你需要做完大量的設計步驟。首先,你必須挑選出基 類。它會派生自FrameworkElement,Control,或WPF提供的其它基類型之一麼?然後你必須定義API,決 定你的組件哪個屬性,事件和命令。最後,如果你的新元素提供了與內嵌組件相同的彈性,你需要注意元 素和其模板間的接口。