6

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

4

2 回答 2

7

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

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

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

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

无论如何,您选择哪一个...您有问题...当有人在与您从中复制模板的主题不同的主题中运行 Windows 时...该控件将看起来错误/不正确地方。

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

因此,要正确执行此操作,您必须复制和修改每个主题(Classic、Luna、Aero、Royale 等)的模板,并执行必要的步骤以在主题更改时加载不同的主题模板......以便您的控件具有“主题意识”。


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

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

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


在运行时获取 ControlTemplate 的副本,并修改“Part”

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

这样做的好处是,如果系统中有新主题,您事先不知道它们的名称(因此没有为其设计模板),那么您的控制模板不是从通用主题中获取的(因此不合适)......你有更好的机会让外观更好地适应新主题。但这有点骇人听闻。

于 2012-08-17T23:40:05.653 回答
3

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

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

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

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

于 2012-08-17T19:13:54.257 回答