设置悬停在 GridView 列标题上的背景颜色

问题描述 投票:0回答:1

应该足够简单和常见:我想覆盖 GridView ColumnHeader 上的悬停颜色。

所以我使用了

<GridView.ColumnHeaderContainerStyle >
<Trigger>
<Setter>
,但它完全被忽略了。它应该是丑陋的绿色,但不是,它是某种蓝色。 触发器正在工作,如果我添加一个前景属性设置器,它就会工作。

我错过了什么?

<ListView ...>
    ...
    <ListView.View>
        <GridView AllowsColumnReorder="False" >
            <GridView.ColumnHeaderContainerStyle >
                <Style TargetType="{x:Type GridViewColumnHeader}" >
                    <Setter Property="Background" Value="{StaticResource MahApps.Brushes.Gray10}" />
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="Green"></Setter>
                            <Setter Property="Foreground" Value="Blue"></Setter>
                        </Trigger>
                    </Style.Triggers>
               </Style>
          </GridView.ColumnHeaderContainerStyle>
          <GridViewColumn  Header="NOT GREEN" Width="150" />
        </GridView>
    </ListView.View>
    ...
</ListView>

编辑:我做了一些窥探,我可以跟踪 MouseOver 上似乎优先的 ControlTemplate 触发器。但是,查看文档(https://learn.microsoft.com/en-us/dotnet/desktop/wpf/properties/dependency-property-value-precedence?view=netdesktop-7.0&redirectedfrom=MSDN),我我不确定哪个是优先顺序

  1. 当地价值观。
  2. 模板化父级
  3. 隐式样式。
  4. 风格触发器。
  5. 模板触发器。
  6. 样式设置器值。

据此,我相信我的样式触发器将优先于 ControlTemplate 触发器

wpf xaml listview hover
1个回答
0
投票

您将需要覆盖

Style
GridViewColumnHeader.Template
,因为它通过其他属性管理背景。下面链接的文档包含用于构建控件的所有 xaml,因此您可以明白为什么设置标题的背景没有帮助。核心问题是悬停是由
VisualStateGroup
设置的,而不是模板绑定。如此有效地覆盖了您设置的任何 MouseOver 触发器。 https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/listview-styles-and-templates?view=netframeworkdesktop-4.8

这是一个示例,利用 Microsoft 文档中提供的模板并根据您的需求进行修改,您最终可能会得到类似于我下面的内容。请注意,这可能会缺少内置控件中的内容,但您可以通过从上面链接的文档中 Microsoft 提供的内容开始将这些内容添加回来。

<ListView>
    <ListView.View>
        <GridView AllowsColumnReorder="False">
            <GridView.ColumnHeaderContainerStyle>
                <Style TargetType="GridViewColumnHeader">
                    <Setter Property="Background"
                            Value="Gray" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="GridViewColumnHeader">
                                <Grid Background="{TemplateBinding Background}">
                                    <ContentPresenter x:Name="HeaderContent"
                                                        Margin="0,0,0,1"
                                                        RecognizesAccessKey="True"
                                                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                        HorizontalAlignment="Stretch"
                                                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                    <Thumb x:Name="PART_HeaderGripper"
                                            HorizontalAlignment="Right"
                                            Margin="0,0,-9,0"
                                            Style="{StaticResource GridViewColumnHeaderGripper}" />
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver"
                                    Value="True">
                            <Setter Property="Background"
                                    Value="Green"></Setter>
                            <Setter Property="Foreground"
                                    Value="Blue"></Setter>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </GridView.ColumnHeaderContainerStyle>
            <GridViewColumn  Header="NOT GREEN"
                                Width="150" />
        </GridView>
    </ListView.View>
</ListView>

由于我们要覆盖整个控件,因此我们需要添加回默认的

Thumb
(即调整列大小的夹点),如下所示:

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

结果

© www.soinside.com 2019 - 2024. All rights reserved.