如何在WPF中点击组合框(组合框打开)时更改组合框背景颜色?
答
这里有一个稍微天真的做法:
<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
下拉出现时。但是,有两个问题:
- 在某些Windows主题(例如,在Vista和Windows 7中使用Aero主题),绿色背景被通过主题使用指示蓝色颜色掩盖了下拉的按钮已被按下。所以按钮在淡入青色之前会短暂地变绿。
-
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
实际上不是为支持自定义背景色而设计的,因此您需要为控件创建自己的自定义外观。
答
好了,要回答你的代码背后的问题:
项添加到您的组合框:
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的背景颜色。
答
首先,您需要获取Combobox的默认模板(如果需要它们,请参阅下面的详细信息)。然后,把这个XAML的第一个“ControlTemplate.Triggers”标签内:
<DataTrigger Binding="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" Value="True">
<Setter Property="Background" TargetName="templateRoot" Value="Red"/>
</DataTrigger>
你的组合框按钮为红色时的下拉是开放的。
获取默认模板:在Visual Studio 2015中,以设计模式查看您的页面。然后,右键单击组合框,然后选择“编辑模板 - >编辑副本”。这将为您生成默认模板。
你能告诉我们你正在使用什么语言或框架吗? – Dominic 2013-02-12 05:40:55
什么编程语言? – spajce 2013-02-12 06:31:35
你好,这是WPF(。净) – Nimesh 2013-02-13 06:11:43