使用ComboBox样式设置ComboBoxItem样式(例如,鼠标悬停突出显示颜色)

时间:2014-05-09 19:24:29

标签: c# wpf silverlight xaml

使用ComboBox样式设置ComboBoxItem高亮颜色的最直接方法是什么?

例如,我希望能够写出类似的内容:

<my:ExtendedComboBox ItemBackgroundHighlight="Green" />
<my:ExtendedComboBox ItemBackgroundHighlight="Red" />

让每个ComboBox都具有鼠标悬停/选定突出显示的相应颜色。

修改

正如我可能已经猜到的那样,there is a simple way to do this in WPF,但在Silverlight中是不可能的。

1 个答案:

答案 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" />

鼠标悬停和选择时显示颜色:

Styled combo boxes

注意:确保按如下方式设置DefaultStyleKey属性。这样,修改后的控件模板将应用于ExtendedComboBoxItems,而默认模板将应用于ExtendedComboBox。

  • on ExtendedComboBox:DefaultStyleKey = typeof(ComboBox)
  • on ExtendedComboBoxItem:DefaultStyleKey = typeof(ExtendedComboBoxItem)