Измените фон WPF ListBoxItem, когда он выбран, а окно потеряло фокус

Я работал над учебным проектом, используя MahApps: Metro (не знаю, актуально ли это), когда я застрял в следующая проблема:

Есть ли способ изменить Background ListBoxItem только, когда он выбран и Window теряет фокус?

См. Следующие изображения для иллюстрации:

Изображение номер один

Здесь мы видим мой ListBox с первым выбранным элементом, когда окно имеет фокус.

Изображение номер два

И на этом втором изображении мы можем увидеть, как это выглядит, когда фокус находится на Window цифре два.

Я хотел бы знать, есть ли способ изменить синий Background SelectedItem на светло-серый, например, только, когда окно теряет фокус.

Вот что я пока искал:

  • Перезаписать ControlBrushKey (на самом деле вроде работает, но заменяет стиль, когда окно имеет фокус) [1] [2] [3]
  • Перезаписать HighlightBrushKey (та же проблема) [1]

Спасибо!


person appa yip yip    schedule 01.02.2016    source источник


Ответы (2)


В настоящее время это возможно только в том случае, если вы самостоятельно переопределите стиль ListBoxItem (я изменю это в следующих выпусках MahApps).

Это то, что вам нужно:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsSelected" Value="True" />
        <Condition Property="Selector.IsSelectionActive" Value="False" />
    </MultiTrigger.Conditions>
    <Setter Property="Background" Value="{DynamicResource GrayBrush7}" />
</MultiTrigger>

Полный стиль:

<Style x:Key="CustomMetroListBoxItem"
       BasedOn="{StaticResource MetroListBoxItem}"
       TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border x:Name="Border"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
                    <ContentPresenter Margin="{TemplateBinding Padding}"
                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="{DynamicResource AccentColorBrush}" />
            <Setter Property="Foreground" Value="{DynamicResource AccentSelectedColorBrush}" />
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="{DynamicResource AccentColorBrush3}" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="{DynamicResource GrayBrush7}" />
        </Trigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsEnabled" Value="False" />
                <Condition Property="IsSelected" Value="True" />
            </MultiTrigger.Conditions>
            <Setter Property="Background" Value="{DynamicResource GrayBrush7}" />
            <Setter Property="Foreground" Value="{DynamicResource AccentSelectedColorBrush}" />
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="True" />
                <Condition Property="Selector.IsSelectionActive" Value="False" />
            </MultiTrigger.Conditions>
            <Setter Property="Background" Value="{DynamicResource GrayBrush7}" />
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="True" />
                <Condition Property="Selector.IsSelectionActive" Value="True" />
            </MultiTrigger.Conditions>
            <Setter Property="Background" Value="{DynamicResource AccentColorBrush2}" />
        </MultiTrigger>
    </Style.Triggers>
</Style>

Использование:

<ListBox ItemContainerStyle="{StaticResource CustomMetroListBoxItem}"
         Style="{StaticResource VirtualisedMetroListBox}" />

Надеюсь это поможет!

person punker76    schedule 02.02.2016

Пример ниже решает вашу проблему. Обратите внимание на MultiDataTrigger.

<Window.Resources>
    <DataTemplate x:Key="DataTemplate1">
        <Grid Width="200" Background="Lime">
            <TextBlock Text="{Binding}" Foreground="Black"/>
        </Grid>
    </DataTemplate>
    <DataTemplate x:Key="DataTemplate2">
        <Grid Width="200" Background="DarkGray">
            <TextBlock Text="{Binding}" Foreground="Black"/>
        </Grid>
    </DataTemplate>
    <DataTemplate x:Key="DataTemplate1Sel">
        <Grid Width="200" Background="Coral">
            <TextBlock Text="{Binding}" Foreground="Black"/>
        </Grid>
    </DataTemplate>
</Window.Resources>

<ListBox x:Name="Lst" Margin="0,56,10,0">
    <ListBox.Resources>
        <Style TargetType="ListBoxItem">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="ContentTemplate" Value="{DynamicResource DataTemplate1Sel}"/>
                </Trigger>
                <Trigger Property="IsSelected" Value="False">
                    <Setter Property="ContentTemplate" Value="{DynamicResource DataTemplate1}"/>
                </Trigger>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition  Binding="{Binding IsActive, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}}" Value="False"/>
                        <Condition  Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="True"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.Setters>
                        <Setter Property="ContentTemplate" Value="{DynamicResource DataTemplate2}"/>
                    </MultiDataTrigger.Setters>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.Resources>
</ListBox>

Вывод

person AnjumSKhan    schedule 02.02.2016