7

有谁能知道,

如何在 WPF 中单击(打开组合框)时更改组合框背景颜色?

4

3 回答 3

2

这是一个有点幼稚的方法:

<ComboBox
  ItemsSource="{x:Static Fonts.SystemFontFamilies}"
  Width="100"
  >
  <ComboBox.Style>
    <Style TargetType="ComboBox">
      <Setter Property="Background" Value="Green" />
      <Style.Triggers>
        <Trigger Property="IsDropDownOpen" Value="True">
          <Setter Property="Background" Value="Red" />
        </Trigger>
      </Style.Triggers>
    </Style>
  </ComboBox.Style>
</ComboBox>

最初,这会将Background属性设置为,但会安排它在下拉菜单出现时Green转到。Red但是,这样做有两个问题:

  1. 在某些 Windows 主题中(例如,在 Vista 和 Windows 7 中使用的 Aero 主题),绿色背景会被主题用来指示下拉按钮已被按下的蓝色所掩盖。因此按钮会在淡出为青色之前短暂变为绿色。
  2. ComboBox.Background属性仅影响按钮本身的外观,而不影响下拉列表。您实际想要做的可能是更改弹出部分的背景颜色。

如果 2 是您想要的,这可以解决问题:

<ComboBox
  ItemsSource="{x:Static Fonts.SystemFontFamilies}"
  Width="100"      >
  <ComboBox.Resources>
    <Style TargetType="ComboBoxItem">
       <Setter Property="Background" Value="Orange" />
    </Style>
  </ComboBox.Resources>
</ComboBox>

严格来说,这实际上是在更改ComboBoxItem下拉菜单中出现的控件的背景颜色,但这会产生预期的效果。

但是,如果要修复 1,则需要自定义模板,因为内置ComboBox模板实际上并不能很好地支持该Background属性,因为它会在各种情况下更改按钮部分的颜色。Aero 主题的外观ComboBox并不是为支持自定义背景颜色而设计的,因此您需要为控件创建自己的自定义外观。

于 2013-02-25T17:05:41.680 回答
0

好的,回答您关于背后代码的问题:

将项目添加到您的组合框:

foreach (String tag in tags)
{
    ComboBoxItem item = new ComboBoxItem();
    item.Content = tag;
    cbTags.Items.Add(item);
}

然后您可以修改项目背景颜色:

((ComboBox)o).Background = GetBrushByRGB(r, g, b);
foreach (ComboBoxItem item in ((ComboBox)o).Items)
{
    item.Background = GetBrushByRGB(r, g, b);
}

所以基本上你需要改变 ComboBoxItem 的背景色。

于 2014-10-27T16:07:47.040 回答
0

首先,您需要获取 Combobox 的默认模板(如果需要,请参阅下面的详细信息)。然后,将此 XAML 放在第一个“ControlTemplate.Triggers”标签中:

<DataTrigger Binding="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" Value="True">
    <Setter Property="Background" TargetName="templateRoot" Value="Red"/>
</DataTrigger>

当下拉菜单打开时,您的组合框按钮将变为红色。

获取默认模板: 在 Visual Studio 2015 中,在设计模式下查看您的页面。然后,右键单击组合框,然后选择“编辑模板->编辑副本”。这将为您生成默认模板。

于 2016-12-28T20:18:29.320 回答