如何实现IsSelected ListBoxItem样式触发器

时间:2013-08-31 17:25:42

标签: .net wpf xaml

为什么这不起作用?

<ListBox>
    <ListBox.Items>
        <ListBoxItem>Foo</ListBoxItem>
        <ListBoxItem>Bar</ListBoxItem>
        <ListBoxItem>Text</ListBoxItem>
    </ListBox.Items>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True" >
                    <Setter Property="Background" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

即,Background的{​​{1}}在选中时不会发生变化。

我希望在不必覆盖默认项目模板的情况下实现这种简单的行为。当然,这里有一个简单的解决方案,我只是没有看到。

更新

我在Windows 7和Windows 8中找到的唯一方法是覆盖默认的ListBoxItem。由于我现在可以右键单击Visual Studio中的控件和编辑样式 - 编辑副本... ,但这样做有点不那么痛苦,但这感觉有些过分,因为我只是最终改变了我在下面评论了一行XAML。我只展示了我被迫介绍/覆盖的完整模板的一小部分相关部分。

有没有更简单的方法?

ItemContainerStyle

1 个答案:

答案 0 :(得分:1)

尝试在ListBox.Resources中添加此内容,然后移除IsSelected触发器:

<ListBox.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" />
</ListBox.Resources>

在系统中有默认的高亮显示笔刷,具体取决于您的系统主题。要更改此值,必须转到SystemColors

引自MSDN

  

SystemColors类提供对系统画笔和颜色的访问,例如ControlBrush,ControlBrushKey和DesktopBrush。系统画笔是一个SolidColorBrush对象,它使用指定的系统颜色绘制区域。系统刷总是产生实心填充;它不能用于创建渐变。

     

您可以将系统画笔用作静态或动态资源。如果您希望刷子在应用程序运行时更改系统画笔时自动更新,请使用动态资源;否则,请使用静态资源。

.NET 4.5系统中不使用SystemColors,因此,您应该: