Fla*_*ack 4 wpf controltemplate
我想对默认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>
Run Code Online (Sandbox Code Playgroud)
但这会导致默认模板的其余部分被忽略.
有没有办法可以覆盖PART_EditableTextBox的特定属性,还是我必须复制整个控件模板并在那里进行更改?
一些不同的方法来改变控件的外观......
复制和修改控件的模板时......你必须记住一件事......主题.
控件可能具有完全不同的模板设计,具体取决于主题(即不同的chrome)......所以你的问题是......你选择在你的控件上复制,修改然后使用哪个模板.
无论你选择哪一个......你都有问题...当某人在一个主题中运行Windows时,你从复制模板的主题不同......那个控件会看起来不对地点.
要查看不同主题模板在不同主题中的外观,请使用ShowMeTheTemplate:
所以为了正确地做到这一点,你必须复制和修改每个主题(Classic,Luna,Aero,Royale等)的模板,并执行必要的步骤,以便在主题发生变化时让你的主题模板加载...这样你的控制就是"主题意识".
http://windowsclient.net/blogs/nidonocu/archive/2008/02/16/wpf-themes-and-control-libraries.aspx
如果您是控件的作者或者您创建了控件的派生版本...那么您可以等到模板应用然后OnApplyTemplate...然后您可以在可视化树中搜索"部件",并且然后在运行时修改可视树/更改属性(即,您可以更改PART_EditableTextBox的背景).
但是,如果您依赖于隐式样式(就像这样),或者不希望或不能用XAML中的派生版本替换所有控件,则这不起作用.
还有另一种可能性......在运行时获取控件的ControlTemplate ...(将用于当前设置的当前主题)....修改它,然后将其设置到Control上.
这样做的好处是,如果系统中有新的主题,你没有事先知道它们的名字(因此没有为它设计模板),那么代替你的控制模板从通用主题中选取(因此不合适)....你有更好的机会看起来更适合新的主题.但这有点像黑客.