WPF在combBox的PART_EditableTextBox上改变属性

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的特定属性,还是我必须复制整个控件模板并在那里进行更改?

Col*_*ith 6

一些不同的方法来改变控件的外观......

复制控件模板,编辑它并在样式中使用它

复制和修改控件的模板时......你必须记住一件事......主题.

控件可能具有完全不同的模板设计,具体取决于主题(即不同的chrome)......所以你的问题是......你选择在你的控件上复制,修改然后使用哪个模板.

无论你选择哪一个......你都有问题...当某人在一个主题中运行Windows时,你从复制模板的主题不同......那个控件会看起来不对地点.

要查看不同主题模板在不同主题中的外观,请使用ShowMeTheTemplate:

所以为了正确地做到这一点,你必须复制和修改每个主题(Classic,Luna,Aero,Royale等)的模板,并执行必要的步骤,以便在主题发生变化时让你的主题模板加载...这样你的控制就是"主题意识".


在运行时应用模板后修改可视树

如果您是控件的作者或者您创建了控件的派生版本...那么您可以等到模板应用然后OnApplyTemplate...然后您可以在可视化树中搜索"部件",并且然后在运行时修改可视树/更改属性(即,您可以更改PART_EditableTextBox的背景).

但是,如果您依赖于隐式样式(就像这样),或者不希望或不能用XAML中的派生版本替换所有控件,则这不起作用.


在运行时获取ControlTemplate的副本,并修改"部件"

还有另一种可能性......在运行时获取控件的ControlTemplate ...(将用于当前设置的当前主题)....修改它,然后将其设置到Control上.

这样做的好处是,如果系统中有新的主题,你没有事先知道它们的名字(因此没有为它设计模板),那么代替你的控制模板从通用主题中选取(因此不合适)....你有更好的机会看起来更适合新的主题.但这有点像黑客.