样式化选定的ListBoxItem

时间:2017-10-16 15:04:43

标签: c# wpf xaml

修改

<Window x:Class="test_project.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:test_project"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

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

                <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Yellow" Opacity="0.6" />
                <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="White" />
            </ListBox.Resources>
            <ListBox.Items>
                <ListBoxItem Content="Hello"/>
                <ListBoxItem Content="Hello"/>
            </ListBox.Items>
        </ListBox>
    </Grid>
</Window>

我想要为ListBoxItem设置样式,使其在选中时具有带白色文字的蓝色背景。我在网上看了很多答案,他们似乎都提出了矛盾的意见,到目前为止,这些意见都没有对我有用。这是我的ListBox

<ListBox Grid.Row="1" Margin="5" ItemContainerStyle="{StaticResource BlueItemStyle}"
            BorderBrush="#06658D" 
            ItemsSource="{Binding UsersView}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这是我到目前为止使用的Style,它什么都没有实现:

<!--ListBoxItem-->
<Style TargetType="{x:Type ListBoxItem}" x:Key="BlueItemStyle">
    <Setter Property="Height" Value="40"/>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Background" Value="#06658D"/>
        </Trigger>
    </Style.Triggers>
</Style>

但是,这不会以任何方式设置ListBoxItem的样式。简单地说,我的问题是选择ListBoxItem样式的最简单方法,因此ListBox看起来像这样:

Demo

1 个答案:

答案 0 :(得分:-1)

此解决方案在Windows 10上不起作用,这意味着它不再适用于未来。谢谢,微软。

据我所知,这必须意味着替换ListBoxItem控件模板。解决该案件的两个问题:

  1. WPF. ListBox item style
  2. https://stackoverflow.com/a/35810145/424129
  3. 您无法通过该方式更改所选项目背景颜色; Background的{​​{1}}属性不会因选择状态而发生变化。相反,ListBoxItem的默认控件模板使用ListBoxItem进行取消选择,并且具有触发器,当Background{DynamicResource {x:Static SystemColors.HighlightBrushKey}}替换某些模板子项的实际背景画笔IsSelectedtrue

    可以对您DataTemplate的孩子执行相同操作,或者您可以替换Template,但只是覆盖资源更容易。

    您也可以全局覆盖相同的资源,以获得一致的外观。

    <ListBox 
        Grid.Row="1" 
        Margin="5" 
        ItemContainerStyle="{StaticResource BlueItemStyle}"
        BorderBrush="#06658D" 
        ItemsSource="{Binding UsersView}"
        >
        <ListBox.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#06658D" />
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="White" />
    
            <!-- 
            The default inactive selection color in Win7 is much too pale for my taste; 
            our older users are unable to distinguish it from white on most monitors. 
            -->
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="#06658D" Opacity="0.6" />
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="White" />
        </ListBox.Resources>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>