假设我们的ControlTemplate
有一个'XAML很长'Control
。
我们希望只向模板添加1个按钮。
MSDN声称'无法仅替换控件'的部分可视树。
我真的必须复制所有ControlTemplate并将我的Button添加到它吗?
或者:是否有可能如何为特定元素提供某种接口?例如TextBox,这样每个人都可以轻松地对其进行模板化,而无需重新调整整个ControlTemplate。
谢谢!
答案 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