假設我們爲我們的Control
有一個非常'XAML long'ControlTemplate
。 而我們希望只需將1個按鈕添加到模板。 MSDN聲稱「沒有辦法替換控件'的部分視覺樹。 我是否真的必須複製所有ControlTemplate並將其添加到我的Button中?WPF ControlTemplate部分替換
或者:有沒有可能如何爲特定元素提供某種接口?例如一個TextBox,這樣每個人都可以輕鬆地對它進行模板化,而不必重複整個ControlTemplate。
謝謝!
假設我們爲我們的Control
有一個非常'XAML long'ControlTemplate
。 而我們希望只需將1個按鈕添加到模板。 MSDN聲稱「沒有辦法替換控件'的部分視覺樹。 我是否真的必須複製所有ControlTemplate並將其添加到我的Button中?WPF ControlTemplate部分替換
或者:有沒有可能如何爲特定元素提供某種接口?例如一個TextBox,這樣每個人都可以輕鬆地對它進行模板化,而不必重複整個ControlTemplate。
謝謝!
正如qntmfred所說,你不能直接這樣做。然而,如果你擁有你想要自定義的控件(聽起來像你這樣做),那麼你可以通過添加合適的自定義屬性來實現,比如CustomButtons屬性(控件的每個用戶都可以將它們自己的按鈕添加到)或ExtensionContent屬性(控件的每個用戶可以將其設置爲他們想要的任何內容 - 將其保留爲空,添加單個控件,或添加具有任意數量的面板)。您的ControlTemplate將不會爲這些屬性指定語義,而只是將它們託管給它們。例如,假設您提供了一個ExtensionContent屬性。你的控件模板可以提出這個使用ContentPresenter:
<ContentPresenter ContentSource="ExtensionContent" />
和您的用戶可以把任何他們在它想:
<s:StefansControl>
<s:StefansControl.ExtensionContent>
<StackPanel Orientation="Horizontal">
<TextBlock Text="I'm custom content" />
<Button Click="DoSomethingSurprising_Click">Click me</Button>
<Image Source="something.jpg" />
</StackPanel>
</s:StefansControl.ExtensionContent>
</s:StefansControl>
另一種可能是提供您適用於您控制的部分,這樣的樣式屬性用戶可以對它們進行樣式設置(包括更改的模板(僅限於該控件),而無需替換整個樣式/模板。這是你的「與特定元素的接口」的概念,例如提供應用於「foo」TextBox的FooBoxStyle屬性。
簡而言之,這個想法是在基本模板中建立某種「部分可替換性」的度量 - 無論是通過使用內容,樣式,模板還是其組合。 WPF沒有提供「部分替換」的一般概念,但您可以提供您自己的部分替換的特定概念,前提是您可以預測可能需要什麼樣的部分替換。
MSDN是正確的。需要複製整個ControlTemplate。
其實你可以。這不是最舒服的方法,但這裏是你如何做到這一點:Cloning a WPF ControlTemplate
爲什麼不只是,哦,我不知道...將按鈕添加到模板? – Will 2010-01-27 14:56:10
由於解決方案使用該控件,並且每個項目都決定添加哪些按鈕 – 2010-01-27 15:01:34