WPF控件開發之自定義控件(5)

 

儘可能減少幫助器元素所必需的、特定於用戶的綁定或屬性設置。通常,幫助器元素需要某些綁定或屬性設置才能在控件模板中正確工作。幫助器元素和模板化控件應當儘可能多地生成這些設置。在設置屬性或者建立綁定時,注意不要重寫由用戶設置的值。具體的最佳做法如下所示:

命名的幫助器元素應當由父級標識,而且父級應當針對幫助器元素建立任何必需的設置。

對於基於類型的幫助器元素,應當直接針對它們建立任何必需的設置。這樣做可能需要幫助器元素查找它在使用時的信息上下文,包括其 TemplatedParent(它在使用時的模板的控件類型)。例如,在用於 ContentControl 派生類型時,ContentPresenter 會自動將它的 TemplatedParent 的 Content 屬性綁定到它的 Content 屬性。

獨立幫助器元素不能按這種方式進行優化,這是因爲按照定義,幫助器元素和父級不能相互識別。

使用 Name 屬性來標記模板中的元素。如果控件需要在樣式中查找某個元素才能以編程方式訪問它,則該控件應當使用 Name 屬性和 FindName 範例來進行查找。控件不應在未找到所需元素時引發異常,而是應在不提示的情況下禁用需要該元素的功能。

使用最佳做法來表示樣式中的控件狀態和行爲。 下面按順序列出了用來表示樣式中的控件狀態更改和行爲的最佳做法。您應當使用列表上的第一項來實現您的方案。

屬性綁定。示例:在 ComboBox..::.IsDropDownOpen 和 ToggleButton..::.IsChecked 之間綁定。

觸發的屬性更改或屬性動畫。示例:Button 的懸停狀態。

命令。示例:ScrollBar 中的 LineUpCommand / LineDownCommand。

獨立幫助器元素。示例:TabControl 中的 TabPanel。

基於類型的幫助器類型。示例:Button 中的 ContentPresenter 和 Slider 中的 TickBar。

命名的幫助器元素。示例:ComboBox 中的 TextBox。

命名幫助器類型中的冒泡事件。如果您偵聽樣式元素中的冒泡事件,則應當要求生成該事件的元素能夠進行唯一標識。示例:ToolBar 中的 Thumb。

自定義 OnRender 行爲。示例:Button 中的 ButtonChrome。

慎用樣式觸發器(與模板觸發器相對)。會影響到模板中元素屬性的觸發器必須在模板中進行聲明。會影響到控件屬性(沒有 TargetName)的觸發器可以在樣式中聲明,除非您知道更改模板還可能會損壞觸發器。

與現有的樣式模式一致。 一個問題常常有多種解決辦法。注意儘可能與現有的控件樣式模式保持一致。這對於派生自同一基類型(例如,ContentControl、ItemsControl、RangeBase 等)的控件尤其重要。

在不重新模板化的情況下公開屬性來啓用常見自定義項方案。WPF 不支持可插入/可自定義的部件,因此控件用戶只能使用兩種自定義方法:直接設置屬性或者使用樣式設置屬性。請記住,比較合適的做法是,設置數量有限的屬性,使其面向極其常見的高優先級自定義項方案,否則的話,這些方案需要重新模板化。下面是有關何時以及如何啓用自定義項方案的最佳方法:

極其常見的自定義項應當作爲屬性在控件上公開並由模板使用。

不太常見(儘管並非極少見)的自定義項應當作爲附加屬性公開並由模板使用。

需要對已知但是極少見的自定義項重新模板化,這一點也是可以接受的。

主題注意事項 
主題樣式應當嘗試在所有的主題之間具有一致的屬性語義,但不保證能夠實現這一點。作爲控件文檔的一部分,控件應當具有一個描述其屬性語義(即控件屬性的“含義”)的文檔。例如,ComboBox 控件應當定義 Background 屬性在 ComboBox 中的含義。控件的默認樣式應當嘗試遵循在其文檔中的所有主題中定義的語義。另一方面,控件用戶應當注意屬性語義可能因主題而異。在某些情況下,給定的屬性在由特定主題所需的可視化約束下可能無法表示 (例如,對於許多控件來說,傳統主題沒有可以向其應用 Thickness 的邊框)。

主題樣式不需要在所有的主題之間具有一致的觸發器語義。由控件樣式通過觸發器或動畫公開的行爲可能因主題而異。控件用戶應當注意到,控件將不必使用同一個機制在所有的主題中實現一個特定的行爲。例如,一個主題可以使用動畫來表示懸停行爲,而另一個主題則可以使用觸發器。這可能會導致自定義控件上的行爲保留出現不一致現象 (例如,如果控件的懸停狀態是使用觸發器來表示的,那麼,更改背景屬性可能不會影響該狀態)。但是,如果懸停狀態是使用動畫來實現的,那麼,更改背景屬性可能會不可挽回地中斷動畫,從而中斷狀態過渡)。

主題樣式不需要在所有的主題之間具有一致的“佈局”語義。例如,默認的樣式不需要保證控件將在所有的主題中佔用同樣的大小,也不需要保證控件將在所有的主題中具有同樣的內容邊距/空白。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章