鼠标悬停时突出显示DataGrid列标题

时间:2013-02-20 08:49:47

标签: c# wpf datagrid wpfdatagrid

如果我在CanUserSort(或false)中将DataGridTextColumn设置为DataGridTemplateColumn,因为我想手动进行排序,当我将鼠标放在列标题,它不再突出显示。

以下是两个例子:

Both examples

如何强制执行该行为?

2 个答案:

答案 0 :(得分:1)

您可以通过两种方式实现:

  1. 将CanUserSort设置为True,但是对数据网格的排序事件进行canel排序:

    e.Handled = true;

  2. 重新模板化DataGridColumnHeader - 添加鼠标悬停触发器以突出显示标题。

答案 1 :(得分:0)

根据Microsoft文档,当 DataGridHeaderBorder.IsClickable 属性为false时,即使 DataGridHeaderBorder.IsHovered 值为truesource)。因此,为了保持悬停外观, 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}"/>