WPF控件模板部分替换

8
假设我们有一个非常长的XAML ControlTemplate,用于我们的控件。我们想要在模板中添加一个按钮。MSDN声称:“没有办法仅替换控件的一部分可视树。”我真的必须复制整个ControlTemplate并将我的按钮添加到其中吗?
或者:是否有可能为特定元素提供某种接口?例如,一个文本框,以便每个人都可以轻松地对其进行模板化,而无需重复整个ControlTemplate。
谢谢!

为什么不直接把按钮添加到模板中呢? - user1228
因为解决方案使用了该控件,每个项目都可以决定添加哪些按钮。 - theSpyCry
3个回答

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>

另一种可能性是提供样式属性,您可以将其应用于控件的某些部分,以便用户可以对它们进行样式设置(包括仅更改控件的“该部分”模板),而无需替换整个样式/模板。这有点像您的“特定元素的接口”思想,例如提供一个FooBoxStyle属性,该属性被应用于“foo”文本框。
简而言之,这个想法是在基础模板中构建一定程度的“部分可替换性”,无论是通过内容、样式、模板或这些组合。WPF没有提供“部分替换”的通用概念,但是只要您能预测可能需要哪些部分替换,就可以提供自己的特定部分替换概念。

0

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接