Изменить фон в элементе WPF Listview, когда он выбран

У меня есть WPF Listview, и я переопределил ListView.ItemTemplate, чтобы изменить цвет фона элементов в событии ListViewItem.IsMouseOver следующим образом:

<AlternationConverter x:Key="BackgroundConverter">
    <SolidColorBrush>White</SolidColorBrush>
    <SolidColorBrush>
        <SolidColorBrush.Color>
            <Color A="242" R="242" G="242" B="242" />
        </SolidColorBrush.Color>
    </SolidColorBrush>
</AlternationConverter>

    <Style x:Key="alternatingWithBinding" TargetType="{x:Type ListViewItem}">
        <Setter Property="Height" Value="31"/>
        <Setter Property="Background" 
          Value="{Binding RelativeSource={RelativeSource Self},
                 Path=(ItemsControl.AlternationIndex),
                 Converter={StaticResource BackgroundConverter}}"/>
        <Style.Triggers>
            <Trigger Property="ListViewItem.IsSelected" Value="True">
                <Setter Property="ListViewItem.Background" Value="Yellow" />
            </Trigger>
            <Trigger Property="ListBoxItem.IsMouseOver" Value="True">
                <Setter Property="ListBoxItem.Background" Value="Blue" />
            </Trigger>
        </Style.Triggers>
    </Style>

Я пытаюсь добиться другого цвета при наведении курсора на уже выбранный элемент (желтый). Таким образом, на всех элементах он будет синим наведением курсора, а на выбранном желтом элементе он будет зеленым. Я попробовал следующую попытку, используя MultiTrigger, но это не помогло:

        <Style x:Key="alternatingWithBinding" TargetType="{x:Type ListViewItem}">
        <Setter Property="Height" Value="31"/>
        <Setter Property="Background" 
          Value="{Binding RelativeSource={RelativeSource Self},
                 Path=(ItemsControl.AlternationIndex),
                 Converter={StaticResource BackgroundConverter}}"/>
        <Style.Triggers>
            <Trigger Property="ListViewItem.IsSelected" Value="True">
                <Setter Property="ListViewItem.Background" Value="Yellow" />
            </Trigger>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="ListBoxItem.IsMouseOver" Value="True"/>
                    <Condition Property="ListBoxItem.IsSelected" Value="True"/>
                </MultiTrigger.Conditions>
                <Setter Property="ListBoxItem.Background" Value="Green" />
            </MultiTrigger>
            <Trigger Property="ListBoxItem.IsMouseOver" Value="True">
                <Setter Property="ListBoxItem.Background" Value="Blue" />
            </Trigger>
        </Style.Triggers>
    </Style>

Любые идеи? Спасибо.


person user350213    schedule 16.09.2011    source источник
comment
Этот вопрос задают 2-3 раза в день. Взгляните на следующую ссылку: stackoverflow.com/questions/388232/   -  person Fredrik Hedblad    schedule 17.09.2011
comment
извинения .. Я всегда проверяю, не задавал ли кто-нибудь вопрос, думаю, я недостаточно внимательно присмотрелся. И все же спасибо за ссылку.   -  person user350213    schedule 17.09.2011


Ответы (1)


Применяются ли триггеры по порядку? Это может сработать, если вы переместите MultiTrigger вниз, тогда он будет применяться после триггера IsMouseOver.

person davisoa    schedule 16.09.2011
comment
Проблема в том, что системные цвета используются Template, поэтому для изменения Background выбранного элемента вы должны изменить значение системных цветов локально внутри вашего ListBox. Нравится <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue" /> - person Fredrik Hedblad; 17.09.2011
comment
Оба ваших предложения, сделав системные цвета локальными и переместив мульти-триггер вниз, сделали свое дело. Спасибо. - person user350213; 17.09.2011