WPF在comboBox的PART_EditableTextBox上改变属性

时间:2012-08-17 18:55:07

标签: 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>

但是这会导致默认模板的其余部分被忽略。

有没有办法可以覆盖PART_EditableTextBox的特定属性,还是必须复制整个控件模板并在那里进行更改?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

所以为了正确地做到这一点,你必须复制和修改每个主题(Classic,Luna,Aero,Royale等)的模板,并做主题更改时让你的不同主题模板加载的必要步骤......这样你的控制就是&#34;主题意识&#34;。


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

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

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


在运行时获取ControlTemplate的副本,并修改&#34; Part&#34;

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

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

答案 1 :(得分:2)

使用'BasedOn'只会覆盖您在新样式中指定的属性。

但是,在您的情况下,您要覆盖的属性是模板。这是组合框的整个模板,因为这是您尝试在自己的风格中修改的属性。

要覆盖其中的一部分,您必须复制整个控制模板并在那里进行更改;就像你想的那样。

如果您没有Expression Blend来检索整个控件模板,可以在MSDN上找到它们。