Search code examples
wpfxamllistviewtriggerslistviewitem

WPF: IsMouseOver trigger on ListViewItem


I have a following code:

    <Style>
        <Style TargetType="{x:Type ListViewItem}" x:Key="MyStyle">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Red" />
            </Trigger>
        </Style.Triggers>
    </Style>

When I set ItemContainerStyle property on my ListView with this style it doesn't work - background doesn't change.

I saw few similar questions and people reply that it is not working in case of a ListView but nobody gave a simple response how to create this trigger.

Do you have some ideas?


Solution

  • You would need to change the template of the listviewitem in order to achieve this. Here's a working piece of markup based on the win10 template:

        <ListView>
            <ListView.Resources>
                <Style TargetType="ListViewItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate  TargetType="{x:Type ListViewItem}">
                                <Border x:Name="Bd" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}"
                    Background="Transparent" 
                    Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
                                    <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" 
                                  Content="{TemplateBinding Content}" 
                                  ContentStringFormat="{TemplateBinding ContentStringFormat}" 
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="IsMouseOver" Value="True"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Background" TargetName="Bd" Value="Red"/>
                                        <Setter Property="BorderBrush" TargetName="Bd" Value="#A826A0DA"/>
                                    </MultiTrigger>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="Selector.IsSelectionActive" Value="False"/>
                                            <Condition Property="IsSelected" Value="True"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Background" TargetName="Bd" Value="Orange"/>
                                        <Setter Property="BorderBrush" TargetName="Bd" Value="#FFDADADA"/>
                                    </MultiTrigger>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="Selector.IsSelectionActive" Value="True"/>
                                            <Condition Property="IsSelected" Value="True"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Background" TargetName="Bd" Value="Yellow"/>
                                        <Setter Property="BorderBrush" TargetName="Bd" Value="#FF26A0DA"/>
                                    </MultiTrigger>
                                    <Trigger Property="IsEnabled" Value="False">
                                        <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListView.Resources>
    
            <ListViewItem >AAAAAAAAAAAA</ListViewItem>
            <ListViewItem>BBBBBBBBBBBB</ListViewItem>
            <ListViewItem>CCCCCCCCCCCC</ListViewItem>
        </ListView>