WinUI 3 DataGrid禁用行选中、悬停效果的实现问题
WinUI 3 DataGrid 禁用行悬停、选中效果解决方案
我一直尝试在WinUI 3的DataGrid中禁用行的悬停、鼠标划过及选中效果。此前在WPF应用中使用特定代码可完美实现,但迁移至WinUI 3后无法生效。目前需要隐藏行选中状态(参考下图):
此前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" />
完整解决方案
要彻底消除行的悬停、选中视觉效果,需针对行的相关系统资源和样式做调整:
- 覆盖行状态对应的笔刷资源
在资源字典或页面资源中添加以下笔刷,直接替换默认的选中、悬停样式颜色:
<!-- 行选中相关笔刷 --> <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" />
- 关闭选中功能(可选)
如果不需要任何选中交互,直接设置DataGrid的SelectionMode为None,从根源上禁用选中:
<controls:DataGrid SelectionMode="None" />
- 自定义行模板(进阶)
如果需要保留选中逻辑但隐藏视觉反馈,可以重写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
相关产品推荐
相关产品推荐

