2013-02-12 70 views

回答

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实际上不是为支持自定义背景色而设计的,因此您需要为控件创建自己的自定义外观。

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的背景颜色。

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中,以设计模式查看您的页面。然后,右键单击组合框,然后选择“编辑模板 - >编辑副本”。这将为您生成默认模板。