有谁能知道,
如何在 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
但是,这样做有两个问题:
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 中,在设计模式下查看您的页面。然后,右键单击组合框,然后选择“编辑模板->编辑副本”。这将为您生成默认模板。