2

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

以下是两个示例:

两个例子

我怎样才能强迫这种行为?

4

2 回答 2

1

你可以通过两种方式做到这一点:

  1. 将 CanUserSort 设置为 True,但通过以下方式对数据网格的排序事件进行 canel 排序:

    e.Handled = true;

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

于 2013-02-20T11:37:19.347 回答
1

根据 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}"/> 
于 2018-10-17T00:16:33.990 回答