You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI 3 DataGrid禁用行选中、悬停效果的实现问题

WinUI 3 DataGrid 禁用行悬停、选中效果解决方案

我一直尝试在WinUI 3的DataGrid中禁用行的悬停、鼠标划过及选中效果。此前在WPF应用中使用特定代码可完美实现,但迁移至WinUI 3后无法生效。目前需要隐藏行选中状态(参考下图):
DataGrid行选中状态示例

此前WPF可用代码

<controls:DataGrid.Style>
   <Style TargetType="controls:DataGridCell">
           <Setter Property="BorderBrush" Value="Transparent" />
           <Setter Property="FocusVisualStyle" Value="{x:Null}" />
  </Style>
</controls:DataGrid.Style>

已完成的WinUI 3调整

WinUI 3中不存在FocusVisualStyle属性,我已通过覆盖如下笔刷资源禁用了选中时的单元格边框:

<SolidColorBrush x:Key="DataGridCellFocusVisualPrimaryBrush" Color="Transparent" />
<SolidColorBrush x:Key="DataGridCellFocusVisualSecondaryBrush" Color="Transparent" />

完整解决方案

要彻底消除行的悬停、选中视觉效果,需针对行的相关系统资源和样式做调整:

  1. 覆盖行状态对应的笔刷资源
    在资源字典或页面资源中添加以下笔刷,直接替换默认的选中、悬停样式颜色:
<!-- 行选中相关笔刷 -->
<SolidColorBrush x:Key="DataGridRowSelectedBrush" Color="Transparent" />
<SolidColorBrush x:Key="DataGridRowSelectedPointerOverBrush" Color="Transparent" />
<SolidColorBrush x:Key="DataGridRowSelectedUnfocusedBrush" Color="Transparent" />
<!-- 行悬停相关笔刷 -->
<SolidColorBrush x:Key="DataGridRowPointerOverBrush" Color="Transparent" />
<!-- 行焦点边框笔刷 -->
<SolidColorBrush x:Key="DataGridRowFocusVisualPrimaryBrush" Color="Transparent" />
<SolidColorBrush x:Key="DataGridRowFocusVisualSecondaryBrush" Color="Transparent" />
  1. 关闭选中功能(可选)
    如果不需要任何选中交互,直接设置DataGrid的SelectionMode为None,从根源上禁用选中:
<controls:DataGrid SelectionMode="None" />
  1. 自定义行模板(进阶)
    如果需要保留选中逻辑但隐藏视觉反馈,可以重写DataGridRow的模板,移除状态触发器的样式变化:
<controls:DataGrid.RowStyle>
    <Style TargetType="controls:DataGridRow">
        <Setter Property="Background" Value="Transparent" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="controls:DataGridRow">
                    <Grid>
                        <VisualStateManager.VisualStateGroups>
                            <!-- 移除所有状态的样式变化 -->
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal" />
                                <VisualState x:Name="PointerOver" />
                                <VisualState x:Name="Pressed" />
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="SelectionStates">
                                <VisualState x:Name="Unselected" />
                                <VisualState x:Name="Selected" />
                                <VisualState x:Name="SelectedUnfocused" />
                                <VisualState x:Name="SelectedPointerOver" />
                                <VisualState x:Name="SelectedPressed" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <ContentPresenter Content="{TemplateBinding Content}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</controls:DataGrid.RowStyle>

组合以上操作即可完全实现WinUI 3 DataGrid中行悬停、划过及选中效果的禁用。

内容的提问来源于stack exchange,提问作者Prefetcher Shatnawi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:31:05