Изменить цвет фона ListBoxItem, когда он выбран и не сфокусирован - PullRequest
1 голос
/ 16 сентября 2011

Я пытаюсь изменить цвет фона выбранных элементов в списке. Я делал это раньше, используя

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

, который работал. Но если я установил IsEnabled в значение false в ListBox, весь фон ListBox превращается в указанный цвет ControlBrush. Я хочу изменить цвет только в том случае, если выбран элемент ListBoxItem и элемент ListBox не имеет фокуса.

Я пробовал некоторые варианты с триггерами, но не могу заставить его работать. Даже мультитриггер, содержащий условия с IsSelected и IsFocused, не работал для меня.

У кого-нибудь есть решение для меня?

Edit: Попробовал пример с 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 ]

1 голос
/ 16 сентября 2011

Добавьте 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>
0 голосов
/ 16 сентября 2011

Решил проблему сейчас.Казалось, проблема в том, что 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>

Спасибо за вашу помощь!

0 голосов
/ 16 сентября 2011
  1. Вы не можете иметь и IsSelected True, и IsEnabled False.Также IsFocused True и IsEnabled False.

  2. Ваш вопрос говорит об изменении цвета фона для IsSelected как True и IsFocused как False.

В приведенном ниже коде (просто вставьте ListBox XAML в свой код окна) ... все эти комбинации состояний достигнуты ... чтобы проверить, фокусируется ли что-то, но не выбрано,вам нужно будет выбрать какую-нибудь строку, а затем использовать «Control + клавиши со стрелками вверх / вниз», чтобы потерять фокус из выбранной строки и сфокусировать другие невыбранные строки.

Вы также заметите, что цвет Orangeдля фона выбранной строки не появится (хотя Foreground color Cyan работает).Для этого изменения цвета фона вы должны переопределить шаблон ListBoxItem.

    <Window x:Class="WpfApplicationThemeTest.Window2"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:Microsoft.Sample.Controls"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            Title="Window1">
        <ListBox>
            <ListBox.Resources>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Style.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <!--Condition Property="IsEnabled" Value="False"/-->
                                <Condition Property="IsFocused" Value="True"/>
                                <Condition Property="IsSelected" Value="False"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="Yellow"/>
                        </MultiTrigger>
                        <DataTrigger Binding="{Binding}" Value="My Value6">
                            <Setter Property="IsEnabled" Value="False"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ListBox.Resources>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.ItemsSource>
                <x:Array Type="{x:Type sys:String}">
                    <sys:String>My Value1</sys:String>
                    <sys:String>My Value2</sys:String>
                    <sys:String>My Value3</sys:String>
                    <sys:String>My Value4</sys:String>
                    <sys:String>My Value5</sys:String>
                    <sys:String>My Value6</sys:String>
                    <sys:String>My Value7</sys:String>
                    <sys:String>My Value8</sys:String>
                </x:Array>
            </ListBox.ItemsSource>
        </ListBox>
    </Window>

Надеюсь, это направит вас в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...