2010-01-27 75 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。