应该足够简单和常见:我想覆盖 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),我我不确定哪个是优先顺序
- 当地价值观。
- 模板化父级
- 隐式样式。
- 风格触发器。
- 模板触发器。
- 样式设置器值。
据此,我相信我的样式触发器将优先于 ControlTemplate 触发器
您将需要覆盖
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>