【问题标题】:WPF altering property on just PART_EditableTextBox of a combBoxWPF 仅更改组合框的 PART_EditableTextBox 上的属性
【发布时间】:2012-08-17 18:55:07
【问题描述】:

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

【问题讨论】:

    标签: wpf controltemplate


    【解决方案1】:

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

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

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

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

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

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

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


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

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

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


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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-15
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多