我想更改默认wpf组合框的PART_EditableTextBox(例如更改背景)。
我尝试添加这样的风格:
<Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBox">
<TextBox x:Name="PART_EditableTextBox" Background="AntiqueWhite"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
但是这会导致默认模板的其余部分被忽略。
有没有办法可以覆盖PART_EditableTextBox的特定属性,还是必须复制整个控件模板并在那里进行更改?
答案 0 :(得分:6)
改变控件外观的一些不同方法...
复制和修改控件的模板时......你必须记住一件事......主题。
控件可能具有完全不同的模板设计,具体取决于主题(即不同的镶边)......所以你的问题是......你选择在你的控件上复制,修改然后使用哪个模板。
无论你选择哪一个......你都有问题...当某人在一个主题中运行Windows时,该主题与你从中复制模板的主题不同......那个控件会看起来不对/不合适。
要了解不同主题模板在不同主题中的外观,请使用ShowMeTheTemplate:
所以为了正确地做到这一点,你必须复制和修改每个主题(Classic,Luna,Aero,Royale等)的模板,并做主题更改时让你的不同主题模板加载的必要步骤......这样你的控制就是&#34;主题意识&#34;。
When overriding WPF templates do I have to override each theme's template separately?
http://windowsclient.net/blogs/nidonocu/archive/2008/02/16/wpf-themes-and-control-libraries.aspx
如果您是控件的作者或者您创建了控件的派生版本...那么您可以等到模板应用然后在OnApplyTemplate
...然后您可以搜索& #34;第二部分&#34;在可视树中,然后在运行时修改可视树/更改属性(即,您可以更改PART_EditableTextBox的背景)。
但是,如果您依赖于隐式样式(就像您一样),或者不想或不能用XAML中的派生版本替换所有控件,则这不起作用
还有另一种可能性......在运行时获取控件的ControlTemplate ...(将用于当时设置的当前主题)....修改它,然后将其设置到Control上。 / p>
这样做的好处是,如果系统中有新的主题,你没有事先知道他们的名字(因此没有为它设计模板),那么你可以代替控制从通用主题中挑选出来的模板(因此不合适)....你有更好的机会让外观更好地适应新的主题。但这有点像黑客。
答案 1 :(得分:2)
使用'BasedOn'只会覆盖您在新样式中指定的属性。
但是,在您的情况下,您要覆盖的属性是模板。这是组合框的整个模板,因为这是您尝试在自己的风格中修改的属性。
要覆盖其中的一部分,您必须复制整个控制模板并在那里进行更改;就像你想的那样。
如果您没有Expression Blend来检索整个控件模板,可以在MSDN上找到它们。