使用ComboBox样式设置ComboBoxItem高亮颜色的最直接方法是什么?
例如,我希望能够写出类似的内容:
<my:ExtendedComboBox ItemBackgroundHighlight="Green" />
<my:ExtendedComboBox ItemBackgroundHighlight="Red" />
让每个ComboBox都具有鼠标悬停/选定突出显示的相应颜色。
修改
正如我可能已经猜到的那样,there is a simple way to do this in WPF,但在Silverlight中是不可能的。
答案 0 :(得分:3)
这是我能提出的最简单的解决方案。
第一个,子类ComboBoxItem
,添加依赖项属性Brush BackgroundHighlight
并修改其控件模板(这是必要的,因为高亮颜色硬编码为“#FFBADDE9”在默认控件模板中)。需要更改控件模板中的2行,“#FFBADDE9”改为“{TemplateBinding BackgroundHighlight}”:
<Rectangle x:Name="fillColor" Fill="{TemplateBinding BackgroundHighlight}" IsHitTestVisible="False" Opacity="0" RadiusY="1" RadiusX="1"/>
<Rectangle x:Name="fillColor2" Fill="{TemplateBinding BackgroundHighlight}" IsHitTestVisible="False" Opacity="0" RadiusY="1" RadiusX="1"/>
第二个,子类ComboBox
并添加Brush ItemBackgroundHighlight
依赖项属性。此外,重写“GetContainerForItemOverride”方法,返回子类ComboBoxItem并将其“BackgroundHighlight”属性绑定到父“ItemBackgroundHighlight”属性。
protected override DependencyObject GetContainerForItemOverride()
{
var container = new ExtendedComboBoxItem();
var highlightBinding = new Binding
{
Source = this,
Path = new PropertyPath(ItemBackgroundHighlightProperty),
};
container.SetBinding(ExtendedComboBoxItem.BackgroundHighlightProperty, highlightBinding);
return container;
}
就是这样。我现在可以简单地写一下:
<my:ExtendedComboBox ItemBackgroundHighlight="Green" />
<my:ExtendedComboBox ItemBackgroundHighlight="Red" />
鼠标悬停和选择时显示颜色:
注意:确保按如下方式设置DefaultStyleKey属性。这样,修改后的控件模板将应用于ExtendedComboBoxItems,而默认模板将应用于ExtendedComboBox。
ExtendedComboBox
:DefaultStyleKey = typeof(ComboBox)ExtendedComboBoxItem
:DefaultStyleKey = typeof(ExtendedComboBoxItem)