2

I'm having a hard time finding a solution to this so would appreciate any help.

I need to be able to change the background of a GridView row when the mouse is over or of if the row is selected.

Here's my ListView Style.

    <Style x:Key="{x:Static GridView.GridViewScrollViewerStyleKey}"
   TargetType="ScrollViewer">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ScrollViewer">
                <Grid Background="{TemplateBinding Background}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>

                    <DockPanel Margin="{TemplateBinding Padding}">
                        <ScrollViewer DockPanel.Dock="Top"
          HorizontalScrollBarVisibility="Hidden"
          VerticalScrollBarVisibility="Hidden"
          Focusable="false">
                            <GridViewHeaderRowPresenter Margin="2,0,2,0"
            Columns="{Binding Path=TemplatedParent.View.Columns,
                      RelativeSource={RelativeSource TemplatedParent}}"
            ColumnHeaderContainerStyle="{Binding
                         Path=TemplatedParent.View.ColumnHeaderContainerStyle,
                         RelativeSource={RelativeSource TemplatedParent}}"
            ColumnHeaderTemplate="{Binding
                         Path=TemplatedParent.View.ColumnHeaderTemplate,
                         RelativeSource={RelativeSource TemplatedParent}}"
            ColumnHeaderTemplateSelector="{Binding 
                         Path=TemplatedParent.View.ColumnHeaderTemplateSelector,
                         RelativeSource={RelativeSource TemplatedParent}}"
            AllowsColumnReorder="{Binding
                         Path=TemplatedParent.View.AllowsColumnReorder,
                         RelativeSource={RelativeSource TemplatedParent}}"
            ColumnHeaderContextMenu="{Binding
                         Path=TemplatedParent.View.ColumnHeaderContextMenu,
                         RelativeSource={RelativeSource TemplatedParent}}"
            ColumnHeaderToolTip="{Binding
                         Path=TemplatedParent.View.ColumnHeaderToolTip,
                         RelativeSource={RelativeSource TemplatedParent}}"
            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </ScrollViewer>

                        <ScrollContentPresenter Name="PART_ScrollContentPresenter"
          KeyboardNavigation.DirectionalNavigation="Local"/>
                    </DockPanel>
                    <ScrollBar Name="PART_HorizontalScrollBar"
        Orientation="Horizontal"
        Grid.Row="1"
        Maximum="{TemplateBinding ScrollableWidth}"
        ViewportSize="{TemplateBinding ViewportWidth}"
        Value="{TemplateBinding HorizontalOffset}"
        Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>

                    <ScrollBar Name="PART_VerticalScrollBar"
        Grid.Column="1"
        Maximum="{TemplateBinding ScrollableHeight}"
        ViewportSize="{TemplateBinding ViewportHeight}"
        Value="{TemplateBinding VerticalOffset}"
        Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/>

                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="GridViewColumnHeaderGripper" TargetType="Thumb">
    <Setter Property="Width" Value="18"/>
    <Setter Property="Background" Value="{StaticResource NormalBorderBrush}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Thumb}">
                <Border Padding="{TemplateBinding Padding}"
      Background="Transparent">
                    <Rectangle HorizontalAlignment="Center"
        Width="1"
        Fill="{TemplateBinding Background}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="{x:Type GridViewColumnHeader}"
   TargetType="GridViewColumnHeader">
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Foreground"
      Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="GridViewColumnHeader">
                <Grid>
                    <Border Name="HeaderBorder"
        BorderThickness="0,1,0,1"
        BorderBrush="{StaticResource NormalBorderBrush}"
        Background="{StaticResource ControlDarkBrush}"
        Padding="2,0,2,0">
                        <ContentPresenter Name="HeaderContent"
          Margin="0,0,0,1"
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
          RecognizesAccessKey="True"
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </Border>
                    <Thumb x:Name="PART_HeaderGripper"
        HorizontalAlignment="Right"
        Margin="0,0,-9,0"
        Style="{StaticResource GridViewColumnHeaderGripper}"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter TargetName="HeaderBorder"
                Property="Background" Value="{StaticResource NormalBrush}"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="true">
                        <Setter TargetName="HeaderBorder"
                Property="Background" Value="{StaticResource PressedBrush}"/>
                        <Setter TargetName="HeaderContent"
                Property="Margin" Value="1,1,0,0"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground"
                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Role" Value="Floating">
            <Setter Property="Opacity" Value="0.7"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="GridViewColumnHeader">
                        <Canvas Name="PART_FloatingHeaderCanvas">
                            <Rectangle Fill="#60000000"
            Width="{TemplateBinding ActualWidth}"
            Height="{TemplateBinding ActualHeight}"/>
                        </Canvas>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
        <Trigger Property="Role" Value="Padding">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="GridViewColumnHeader">
                        <Border Name="HeaderBorder"
          BorderThickness="0,1,0,1"
          BorderBrush="{StaticResource NormalBorderBrush}"
          Background="{StaticResource ControlDarkBrush}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

<Style x:Key="StyleListView" TargetType="ListView">
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
    <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListView">
                <Border Name="Border"
      BorderThickness="1"
      BorderBrush="{StaticResource BorderLightBrush}"
      Background="{StaticResource ControlDarkBrush}">
                    <ScrollViewer Style="{DynamicResource
                    {x:Static GridView.GridViewScrollViewerStyleKey}}">
                        <ItemsPresenter />
                    </ScrollViewer>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsGrouping"
               Value="true">
                        <Setter Property="ScrollViewer.CanContentScroll"
                Value="false"/>
                    </Trigger>
                    <Trigger Property="IsEnabled"
               Value="false">
                        <Setter TargetName="Border"
                Property="Background"
                Value="{StaticResource DisabledBorderDarkBrush}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

The closest I've come to getting to an answer is this post (code is omitted from my Style as it didn't have any effect) :-

Change ListViewItem background colour on mouse over

However, I'm still unable to control the mouseover and selected colours. I'm getting closer as the post above suggests that it is a button which is actually doing the highlighting and selecting but I don't know how to incorporate that in to my existing style.

Here's the current effect of the Style. The top row is selected, the third row is mouse-overed, the other two rows are normal.

Mouseover / selected colours

BTW, the Style I'm using was extracted from Blend and I tweaked it to use my app colours.

I don't think my Class code would be relevant here but correct me if I'm wrong and I will post it.

maffoo
  • 107
  • 1
  • 8

1 Answers1

2

I think you need to add a style for the ListViewItems and set the ListView.ItemContainerStyle:

<!-- New style -->
<Style x:Key="StyleListViewItem" TargetType="ListViewItem">
  <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
      <Setter Property="Background" Value="Green"/>
    </Trigger>
    <Trigger Property="IsSelected" Value="True">
      <Setter Property="Background" Value="Blue"/>
    </Trigger>
  </Style.Triggers>
</Style>

<!-- Existing style -->
<Style x:Key="StyleListView" TargetType="ListView">
  <Setter Property="ItemContainerStyle" Value="{StaticResource StyleListViewItem}"/>
  <Setter Property="SnapsToDevicePixels" Value="true"/>
  <!-- ... -->
</Style>
Ryan
  • 7,835
  • 2
  • 29
  • 36
  • That worked an absolute treat! You don't know how long I've been trying to figure this out! Many thanks. – maffoo Apr 13 '18 at 11:47