如果我设置CanUserSort
为false
in a DataGridTextColumn
(或 in a DataGridTemplateColumn
),因为我想手动进行排序,当我将鼠标放在列标题上时,它不再突出显示。
以下是两个示例:
我怎样才能强迫这种行为?
如果我设置CanUserSort
为false
in a DataGridTextColumn
(或 in a DataGridTemplateColumn
),因为我想手动进行排序,当我将鼠标放在列标题上时,它不再突出显示。
以下是两个示例:
我怎样才能强迫这种行为?
你可以通过两种方式做到这一点:
将 CanUserSort 设置为 True,但通过以下方式对数据网格的排序事件进行 canel 排序:
e.Handled = true;
重新模板 DataGridColumnHeader - 添加鼠标悬停触发器以突出显示标题。
根据 Microsoft 文档,当DataGridHeaderBorder.IsClickable属性为 时false
,将不会应用悬停外观,即使DataGridHeaderBorder.IsHovered值为true
( source )。因此,为了保持悬停外观,IsClickable属性必须为true
.
DataGridColumnHeader的默认样式使用将其IsClickable属性绑定到列的CanUserSort属性的模板绑定。因此,如果您希望使用默认样式保持悬停外观,则必须设置CanUserSort =true
以使IsClickable = true
。但是,如果您不想允许用户排序,那么使用默认样式可能不是最佳选择。
解决该问题的一种方法是对DataGridColumnHeader使用修改后的样式。您可以复制默认样式并调整IsClickable属性的设置方式。与其使IsClickable依赖于CanUserSort,不如将其直接设置为. 即使禁用了用户排序,这也允许悬停外观保持不变。修改后的样式的 XAML 如下:true
<Style x:Key="ColumnHeaderGripperStyle" TargetType="{x:Type Thumb}">
<Setter Property="Width" Value="8"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Cursor" Value="SizeWE"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Thumb}">
<Border Background="{TemplateBinding Background}"
Padding="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="DataGridColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid>
<Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
IsClickable="True"
IsPressed="{TemplateBinding IsPressed}"
IsHovered="{TemplateBinding IsMouseOver}"
Padding="{TemplateBinding Padding}"
SortDirection="{TemplateBinding SortDirection}"
SeparatorBrush="{TemplateBinding SeparatorBrush}"
SeparatorVisibility="{TemplateBinding SeparatorVisibility}">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Themes:DataGridHeaderBorder>
<Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}"/>
<Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
确保在 XAML 中引用“主题”命名空间,如下所示:
xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
最后,无论您在何处定义DataGridColumn,请确保引用此样式,如下所示:
<DataGridTemplateColumn Width="*" HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"/>