如果我在CanUserSort
(或false
)中将DataGridTextColumn
设置为DataGridTemplateColumn
,因为我想手动进行排序,当我将鼠标放在列标题,它不再突出显示。
以下是两个例子:
如何强制执行该行为?
答案 0 :(得分:1)
您可以通过两种方式实现:
将CanUserSort设置为True,但是对数据网格的排序事件进行canel排序:
e.Handled = true;
重新模板化DataGridColumnHeader - 添加鼠标悬停触发器以突出显示标题。
答案 1 :(得分:0)
根据Microsoft文档,当 DataGridHeaderBorder.IsClickable 属性为false
时,即使 DataGridHeaderBorder.IsHovered 值为true
(source)。因此,为了保持悬停外观, IsClickable 属性必须为true
。
DataGridColumnHeader 的默认样式使用模板绑定,该模板绑定将其 IsClickable 属性绑定到列的 CanUserSort 属性。因此,如果您希望使用默认样式来保持悬停外观,则必须设置 CanUserSort = true
才能使 IsClickable = true
。但是,如果您不想允许用户排序,那么使用默认样式可能不是最佳选择。
解决问题的一种方法是对 DataGridColumnHeader 使用修改后的样式。您可以复制默认样式并调整 IsClickable 属性的设置方式。可以将其直接设置为true
,而不必使 IsClickable 依赖于 CanUserSort 。即使禁用了用户排序,这也可使悬停外观保持不变。修改后的样式的XAML如下:
<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}"/>