WPF ControlTemplate部分替换

时间:2010-01-27 14:38:17

标签: wpf templates controltemplate

假设我们的ControlTemplate有一个'XAML很长'Control。 我们希望只向模板添加1个按钮。 MSDN声称'无法仅替换控件'的部分可视树。 我真的必须复制所有ControlTemplate并将我的Button添加到它吗?

或者:是否有可能如何为特定元素提供某种接口?例如TextBox,这样每个人都可以轻松地对其进行模板化,而无需重新调整整个ControlTemplate。

谢谢!

3 个答案:

答案 0 :(得分:7)

正如qntmfred所说,你不能直接这样做。但是,如果你拥有你想要自定义的控件(你听起来像这样),那么你可以通过添加合适的自定义属性来实现这一点,例如CustomButtons属性(控件的每个用户都可以添加自己的按钮) )或ExtensionContent属性(控件的每个用户可以设置为他们想要的任何内容 - 将其留空,添加单个控件,或添加一个包含所需内容的面板)。您的ControlTemplate不会为这些属性分配语义,而只是在它们被赋予它们时托管它们。例如,假设您提供了ExtensionContent属性。您的ControlTemplate可以使用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>

另一种可能是提供应用于控件部分的Style属性,以便用户可以设置它们的样式(包括更改控件的那部分(仅)的模板)而不替换整个风格/模板。这是你的“特定元素的接口”的想法,例如提供一个FooBoxStyle属性,该属性应用于“foo”TextBox。

简而言之,我们的想法是在基本模板中构建一种“部分可替换性”的度量 - 无论是使用内容,样式,模板还是这些的组合。 WPF不提供“部分替换”的一般概念,但您可以提供自己的部分替换性概念,前提是您可以预测可能需要哪种部分替换。

答案 1 :(得分:0)

MSDN是正确的。必须复制整个ControlTemplate。

答案 2 :(得分:0)

其实你可以。这不是最舒服的方法,但这是你如何做到的:Cloning a WPF ControlTemplate