【问题标题】:Set ComboBoxItem style (eg, mouseover highlight color) using ComboBox style使用 ComboBox 样式设置 ComboBoxItem 样式(例如,鼠标悬停突出显示颜色)
【发布时间】:2014-05-09 19:24:28
【问题描述】:

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

例如,我希望能够编写如下内容:

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

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

编辑

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

【问题讨论】:

  • 如果您已经在为 ComboBox 使用自定义模板,我只会在 VisualStateManager 为 MouseOver/Selected 状态激活它们时找到当前提供该视觉的对象,绑定它的BackgroundFill 或诸如Tag 之类的临时属性在{TemplateBinding Tag} 之类的模板级别并执行&lt;your:ComboBox Tag="Green"/&gt; 等。发布为评论而不是答案,因为我没有太多时间立即进行思考进入它。
  • @ChrisW。谢谢...关于这个的棘手之处在于,由于ComboBoxItem 是一个单独的控件,似乎没有简单的方法将属性(ItemBackgroundHighlight)从父ComboBox 传递给子ComboBoxItems。在下面的回答中,我通过在“GetContainerForItemOverride”中应用从父级到子级的绑定解决了这个问题。
  • 啊,是的,我必须放弃试图快速完成这些事情,而不是一目了然。很高兴你找到了补救措施,干杯

标签: c# wpf silverlight xaml


【解决方案1】:

这是我能想到的最简单的解决方案。

首先,子类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)

【讨论】:

    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2014-10-12
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多