2010-01-27 76 views
8

假設我們爲我們的Control有一個非常'XAML long'ControlTemplate。 而我們希望只需將1個按鈕添加到模板。 MSDN聲稱「沒有辦法替換控件'的部分視覺樹。 我是否真的必須複製所有ControlTemplate並將其添加到我的Button中?WPF ControlTemplate部分替換

或者:有沒有可能如何爲特定元素提供某種接口?例如一個TextBox,這樣每個人都可以輕鬆地對它進行模板化,而不必重複整個ControlTemplate。

謝謝!

+0

爲什麼不只是,哦,我不知道...將按鈕添加到模板? – Will 2010-01-27 14:56:10

+0

由於解決方案使用該控件,並且每個項目都決定添加哪些按鈕 – 2010-01-27 15:01:34

回答

7

正如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沒有提供「部分替換」的一般概念,但您可以提供您自己的部分替換的特定概念,前提是您可以預測可能需要什麼樣的部分替換。

0

MSDN是正確的。需要複製整個ControlTemplate。