选中和未聚焦时更改ListBoxItem背景的颜色

时间:2011-09-16 08:52:08

标签: wpf listbox focus listboxitem

我正在尝试更改列表框中所选项目的背景颜色。我之前使用

做到了
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Yellow" />

哪个有效。但是如果我在ListBox上将IsEnabled设置为false,则ListBox的整个背景将变为ControlBrush的指定颜色。如果选择了ListBoxItem并且ListBox没有焦点,我只想更改颜色。

我尝试了一些带触发器的品种,但我无法让它发挥作用。即使是包含IsSelected和IsFocused条件的多重触发器也不适用于我。

有没有人为我提供解决方案?

修改 尝试使用ItemContainerStyle的示例,我在项目中得到NullReferenceException。它在新的解决方案中有效。这是不起作用的代码:

<ItemsControl ItemsSource="{Binding Path=Classification.Values}" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                                 HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsEnabled="{Binding Path=ClassificationEnabled}"
                                  VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" Grid.Row="0" x:Name="measureClassificationControl">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid Margin="2">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <TextBlock Text="{Binding Category}"/>
                                <ListBox ItemsSource="{Binding Values.SortedList}" SelectionMode="Extended" Grid.Row="1"  AlternationCount="2" 
                                     SelectionChanged="ListBox_SelectionChanged" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Height="120">
                                    <ListBox.ItemTemplate>
                                        <DataTemplate>
                                            <TextBlock TextWrapping="NoWrap" Text="{Binding Key}">
                                            <TextBlock.ToolTip>
                                                <ToolTip>
                                                     <TextBlock TextWrapping="NoWrap" Text="{Binding Value}"/>
                                                </ToolTip>
                                            </TextBlock.ToolTip>
                                        </TextBlock>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>
                                </ListBox>

                            </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <UniformGrid Columns="2"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>

3 个答案:

答案 0 :(得分:1)

SystemColors.ControlBrushKey添加到ItemContainerStyle。这样它只会影响所选项目。

编辑:这是一个完整的Xaml示例。

<StackPanel>
    <ListBox IsEnabled="{Binding ElementName=enabledButton, Path=IsChecked}">
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
                                     Color="Yellow" />
                </Style.Resources>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBoxItem>Item 1</ListBoxItem>
        <ListBoxItem>Item 2</ListBoxItem>
        <ListBoxItem>Item 3</ListBoxItem>
        <ListBoxItem>Item 4</ListBoxItem>
        <ListBoxItem>Item 5</ListBoxItem>
    </ListBox>
    <ToggleButton Name="enabledButton" IsChecked="True" Content="IsEnabled"/>
</StackPanel>

答案 1 :(得分:0)

  1. 您不能同时拥有IsSelected TrueIsEnabled False。另外IsFocused TrueIsEnabled False

  2. 您的问题将IsSelected的{​​{1}}和True的背景颜色更改称为False。

  3. 在下面的代码中(只需在你的窗口代码中粘贴IsFocused XAML)......所有这些状态组合都已实现...要检查某些内容是否已聚焦但未选中,您必须选择某行然后使用“Control +向上/向下箭头键”从所选行中失去焦点并聚焦其他未选择的行。

    您还会发现所选行背景的ListBox颜色不会显示(Orange颜色Foreground可以正常工作)。对于该背景颜色更改,您必须覆盖ListBoxItem的template

    Cyan

    我希望这能指导你正确的方向。

答案 2 :(得分:0)

现在解决了这个问题。问题似乎是当系统颜色被多次覆盖时XamlParser不喜欢它。所以我把它定义为:

<Window x:Class="DataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit" xmlns:DataGridTest="clr-namespace:DataGridTest"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <DataGridTest:VM />
    </Window.DataContext>
    <StackPanel>
        <ItemsControl ItemsSource="{Binding Values}">
            <ItemsControl.Resources>
                <Style TargetType="ListBoxItem">
                    <Style.Resources>
                        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
                                     Color="Yellow" />
                    </Style.Resources>
                </Style>
            </ItemsControl.Resources>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <ListBox IsEnabled="{Binding ElementName=enabledButton, Path=IsChecked}">
                        <ListBoxItem>Item 1</ListBoxItem>
                        <ListBoxItem>Item 2</ListBoxItem>
                        <ListBoxItem>Item 3</ListBoxItem>
                        <ListBoxItem>Item 4</ListBoxItem>
                        <ListBoxItem>Item 5</ListBoxItem>
                    </ListBox>

                </DataTemplate>
            </ItemsControl.ItemTemplate>

        </ItemsControl>
        <ToggleButton Name="enabledButton" IsChecked="True" Content="IsEnabled"/>
    </StackPanel>
</Window>

感谢您的帮助!