WPF ControlTemplate部分替换

PaN*_*1Me 8 wpf templates controltemplate

假设我们有一个非常"XAML长" ControlTemplate为我们的Control.我们只想在模板中添加1个按钮.MSDN声称" 无法替换控件部分可视树 ".我真的必须复制所有ControlTemplate并将我的Button添加到它吗?

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

谢谢 !

ito*_*son 7

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

<ContentPresenter ContentSource="ExtensionContent" />
Run Code Online (Sandbox Code Playgroud)

您的用户可以在其中放置他们想要的任何内容:

<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>
Run Code Online (Sandbox Code Playgroud)

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

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