【问题标题】:WPF : How to change the MouseOver/Selected background colour of a GridView rowWPF:如何更改 GridView 行的 MouseOver/Selected 背景颜色
【发布时间】:2018-09-23 02:45:54
【问题描述】:

我很难找到解决此问题的方法,因此不胜感激。

我需要能够在鼠标悬停或选中行时更改 GridView 行的背景。

这是我的 ListView 样式。

    <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>

我最接近答案的是这篇文章(我的样式中省略了代码,因为它没有任何效果):-

Change ListViewItem background colour on mouse over

但是,我仍然无法控制鼠标悬停和选定的颜色。我越来越近了,因为上面的帖子表明它是一个按钮,实际上是在进行突出显示和选择,但我不知道如何将其合并到我现有的样式中。

这是样式的当前效果。最上面一行被选中,第三行鼠标悬停,其他两行正常。

Mouseover / selected colours

顺便说一句,我使用的样式是从 Blend 中提取的,我对其进行了调整以使用我的应用颜色。

我认为我的课程代码在这里不相关,但如果我错了,请纠正我,我会发布它。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    我认为您需要为ListViewItems 添加样式并设置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>
    

    【讨论】:

    • 这绝对是一种享受!你不知道我一直在努力解决这个问题!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2016-04-25
    • 2015-08-22
    • 2015-10-10
    • 2011-04-29
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多