【问题标题】:WPF ControlTemplate partial replaceWPF ControlTemplate 部分替换
【发布时间】:2011-01-09 23:57:13
【问题描述】:

假设我们的Control 有一个非常“XAML 长”的ControlTemplate。 我们希望只向模板添加 1 个按钮。 MSDN 声称'没有办法只替换控件的可视化树的一部分'。 我真的必须复制所有 ControlTemplate 并将我的 Button 添加到其中吗?

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

谢谢!

【问题讨论】:

  • 为什么不只是,哦,我不知道...将按钮添加到模板中?
  • 因为解决方案使用该控件,并且每个项目都决定添加哪些按钮

标签: wpf templates controltemplate


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    正如 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>
    

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        相关资源
        最近更新 更多