WPF:ListBoxItem.IsSelected的触发器不适用于Background属性

时间:2011-03-19 11:13:20

标签: wpf background styles

我尝试使用我Background的{​​{1}}中的触发器更改我ListBoxItem的{​​{1}}属性,如下所示:

ItemContainerStyle

我希望未选中的项目有浅蓝色背景,悬停项目(即当鼠标光标在它们上面时)为黄色,选定项目为红色。

对于未选择和悬停的项目,这是按预期工作的,但所选项目仍然具有标准背景颜色(即蓝色,如果列表框具有焦点,否则为浅灰色)。

有什么我想念的吗?这种行为是否记录在某处?

感谢任何提示!

修改

我知道覆盖默认系统颜色的解决方案(如Change selected and unfocused Listbox style to not be grayed out中所述,非常感谢所有发布此答案的人)。然而,这不是我想要做的。我更感兴趣的是为什么我的解决方案不起作用。

我怀疑ListBox的标准 <ListBox Height="100" HorizontalAlignment="Left" Margin="107,59,0,0" Name="listBox1" VerticalAlignment="Top" Width="239"> <ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Background" Value="Lightblue"/> <Style.Triggers> <Trigger Property="IsSelected" Value="true"> <Setter Property="Background" Value="Red"/> </Trigger> <Trigger Property="IsMouseOver" Value="true"> <Setter Property="Background" Value="Yellow"/> </Trigger> </Style.Triggers> </Style> </ListBox.ItemContainerStyle> <ListBox.Items> <ListBoxItem Content="First Item"/> <ListBoxItem Content="SecondItem"/> <ListBoxItem Content="Third Item"/> </ListBox.Items> </ListBox> 来定义它自己的触发器,这些触发器似乎优先于样式定义的触发器(可能有人可以确认这一点并指向我的某些资源,行为已定义)。

我的解决方案是为我的ControlTemplate定义一个ListItem

ControlTemplate

4 个答案:

答案 0 :(得分:14)

对Aero风格的一点反思为我们解释了为什么这个简单的触发设置不起作用。

ListBoxItem有一个ControlTemplate,其触发器优先于我们的触发器。对于MultiTrigger来说,至少这似乎是正确的。 我设法覆盖了Selected = true的简单触发器,但对于多重触发器,我必须自己制作ControlTemplate。

这是Aero风格的模板,显示有问题的MultiTrigger:

<ControlTemplate TargetType="{x:Type ListBoxItem}">
    <ControlTemplate.Triggers>
        <Trigger Property="IsSelected" Value="true">
            <Setter TargetName="Bd" Value="{DynamicResource {x:Static HighlightBrush}}" Property="Background" />
            <Setter Value="{DynamicResource {x:Static HighlightTextBrush}}" Property="Foreground" />
        </Trigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="true" />
                <Condition Property="IsSelectionActive" Value="false" />
            </MultiTrigger.Conditions>
            <Setter TargetName="Bd" Value="{DynamicResource {x:Static ControlBrush}}" Property="Background" />
            <Setter Value="{DynamicResource {x:Static ControlTextBrush}}" Property="Foreground" />
        </MultiTrigger>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Value="{DynamicResource {x:Static GrayTextBrush}}" Property="Foreground" />
        </Trigger>
    </ControlTemplate.Triggers>
    <Border Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
    </Border>
</ControlTemplate>

希望它能稍微清理一下。我无法理解为什么他们这么复杂的风格。

答案 1 :(得分:7)

删除IsSelected触发器 并添加到列表框:

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

首先刷第二次,否则

答案 2 :(得分:3)

尝试将此添加到您的窗口资源 -

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

从代码中删除IsSelected Trigger,它将无效,因为每个系统都有默认的高亮笔刷,具体取决于您的系统主题。

您需要覆盖代码中的高亮笔刷才能使其正常工作。

答案 3 :(得分:0)

尝试在Trigger中使用Selector.IsSelected而不是IsSelected。