2011-11-20 141 views
8

我已經構建了一個用戶控件,像往常一樣組成一個XAML部件和一個代碼隱藏部分。現在,我需要創建另一個用戶控件,它共享前者的某些功能,但它們有不同的外觀,並可能在代碼隱藏方面具有其他功能。在WPF中擴展用戶控件

我最初的想法是創建收集兩種類型的控件的常用功能的接口。這是正確的路嗎?我將如何管理我應該擁有的不同XAML部件?任何建議是受歡迎的。

+0

聽起來像代碼隱藏是問題而不是控制。 –

+0

裏奇,你是什麼意思? – Tilvia

+1

這聽起來像你想改變視覺效果,但使用相同的行爲或添加到它。所有這些行爲代碼都被困在代碼隱藏之中並且不可重用的事實引發了一個問題。您是否熟悉演示者模式,例如MVVM? –

回答

9

我想補充的另一個貢獻,我認爲可能是別人遇到我一樣的情況非常有用。

另一種可能的解決方案,在我看來,如果您要創建的控件不是特別複雜的話,那麼這個解決方案就是創建一個基本的用戶控件,其中包含您想要共享的常用功能:這樣的控件將被寫入完全使用C#。實際上,這允許在由XAML和後面的代碼組成的用戶控件中繼承。在繼承控制的XAML,而不是

<UserControl> ... </UserControl> 

您將有

<MyProject: MyBaseControl x:Class="MyProject.MyExtendedControl"> ... </MyProject: MyBaseControl> 

,然後在後面的代碼,你還需要指定以下內容:

class MyExtendedControl : MyBaseControl 

希望這可以幫助。

2

用戶控件本身不能很好地繼承在WPF中,你可以做一些處理,使其工作,但總體來說,你會使用自定義的控制,而不是可能會更好。使用這種技術爲繼承控件指定不同的XAML會更容易。開始使用自定義控件的最簡單方法是向類型爲「自定義控件(WPF)」的項目中添加一個新項目,並添加控件,並將XAML添加到Themes/generic.xaml中。

要從此控制繼承,最簡單的方法是添加另一個新的自定義控制(WPF),然後改變後面的代碼從你的父母控件,而不是控制繼承。

+0

所以,如果我理解正確,你的建議是我應該有兩個自定義控件繼承第三個包含常用功能的控件? – Tilvia

+1

是的,這是正確的,如果您只有一些常用功能,另一種選擇是繼續使用UserControl並使用附加的屬性或行爲作爲常用功能 –

2

有許多的方式來分割的作品,使它們更容易使用。

MVVM,如在評論中提及,依賴於數據綁定到所述輸入控制從邏輯分離。通過將實現INotifyPropertyChanged的適當類設置到您控制的DataContext中,您可以更改行爲。如果兩種用法之間的差異不太大,則您的DataContext類或ViewModel可以實現可見性屬性以顯示和隱藏輸入的不同部分。

分解功能的另一種方式是通過聚合。請參閱StackOverflow 269496

您可以構建實現常用功能的較小控件,然後通過組合較小的控件(即聚合它們)來構建更大的特殊用途控件以實現更大的控件。聚合將適用於代碼隱藏和數據綁定方法。