2009-08-20 36 views
3

我已經開始爲高度可視化的項目編寫一些自定義控件。我想知道在編寫WPF自定義控件時,您的「最佳實踐」是什麼?在WPF中編寫自定義控件的最佳做法是什麼?

+1

您應該針對此類問題提出一個建議/回答,以備將來參考。 – 2009-08-20 14:33:05

回答

2

確保可以在不改變控制方式的情況下對控件進行重新設計和重新模板化。不要讓控件假定列表框和按鈕都在同一個面板中,或者甚至有一個列表框或按鈕。查看MSDN article on control authoring瞭解如何執行此操作的一些建議。

3

保持屬性名稱與內置控件的屬性名稱相同,只要不改變其含義即可。

例如如果您有一個CustomerDisplayer自定義控件,請不要調用客戶的客戶列表,將其稱爲ItemsSource。

起初它可能看起來不符合直覺,但是從長遠來看,它可以節省很多頭痛,因爲未來的程序員可以對一個名爲ItemsSource的屬性如何行動做出很多假設,而這些假設對於一個Customers屬性。

3

如果您希望自定義的控制,以支持直接的內容是這樣的:

<CustomObject> 
    Direct content example 1 
</CustomObject> 

<!-- or --> 

<CustomObject> 
    <Button Content="Direct content example 2" /> 
</CustomObject> 

然後,你需要使用ContentPropertyAttribute告訴哪個屬性,當你寫這樣的XAML實際上是被設定WPF。

的屬性可以像這樣使用:

[ContentProperty("NameOfProperty")] 
public class CustomObject 
{ 
    [...] 

ContentControl使用該屬性來設置內容屬性,但請注意,屬性可以叫什麼;例如WPF TextBox使用此屬性來設置Text屬性。

E.G.

[ContentProperty("Text")] 

酒店也做必須是依賴屬性(見這方面的證據MSDN文檔的例子)。

最後,這種屬性是特定於XAML分析器而不是ContentControl,並且可以與任何類型的能夠從TextBox例如上述(TextBox不從ContentControl派生)可以看出可以使用。

0

某些內容控件取決於其ControlTemplate中是否存在其他控件。通常這應該使用TemplatePart屬性進行記錄。

例如,Combobox控件取決於其模板中是否存在TextBoxPopup控件。

這將通過把屬性的類像這樣被記錄:

[TemplatePart(name="PART_EditableTextBox", type=typeof(TextBox))] 
[TemplatePart(name="PART_Popup", type=typeof(Popup))] 
public class Combobox : Selector 
{ 
    [...] 

的命名約定爲「PART_controlIdentifier」。

相關項目將隨後在控制模板被賦予相同的名稱,以便它們可以定位在OnApplyTemplate方法。

這便於控制掛鉤到事件,設置屬性和調用方法包含在模板中的控件。

此屬性是文檔的目的,使人們設計定製控件模板(和工具,如Expression Blend中)知道,控制依賴於他人的存在。

0

瞭解如何使用這兩種dependency propertiesrouted events(以及它們如何工作),這樣就可以在自己的控制有效地使用它們。

這些類型的兩者都提供集成與內置WPF系統的控制服務。

通過自定義使用這兩個功能控制,你會得到以下優點:

  1. 依賴屬性的數據綁定,動畫提供支持,並且可以在風格下使用。

  2. 路由事件可以通過可視化樹,這意味着其他元件可以處理事件將會傳播。

相關問題