如何让UWP DataGrid始终显示展开状态的垂直滚动条
UWP DataGrid 永久显示常规垂直滚动条的解决方案
可行,UWP默认的ScrollBar包含紧凑(细线)和常规两种视觉状态,默认仅在鼠标悬停时切换到常规状态。你可以通过以下两种方法实现永久显示常规滚动条:
方法1:重写ScrollBar的样式
UWP的DataGrid内部的垂直滚动条(命名为PART_VerticalScrollBar)默认使用系统ScrollBar样式,带有紧凑状态逻辑。你可以通过修改样式强制它始终处于常规状态:
- 在Blend中打开项目,选中DataGrid右键选择「编辑模板」→「编辑副本」,生成完整的DataGrid样式资源。
- 在生成的样式中找到内部的
PART_VerticalScrollBar控件,为它指定自定义的ScrollBar样式。 - 在自定义ScrollBar样式里,找到
VisualStateManager下的ScrollBarStates组,移除Compact状态的定义,或者直接将默认状态设为Normal:
<VisualStateGroup x:Name="ScrollBarStates"> <VisualState x:Name="Normal"/> <!-- 删除Compact状态的相关定义 --> </VisualStateGroup>
修改后滚动条会一直保持常规显示状态。
方法2:通过代码强制切换视觉状态
如果不想修改样式,可以在代码里找到滚动条并强制切换到Normal状态,同时监听布局更新防止状态被重置:
private void DataGrid_Loaded(object sender, RoutedEventArgs e) { var verticalScrollBar = FindVisualChild<ScrollBar>(dataGrid, "PART_VerticalScrollBar"); if (verticalScrollBar != null) { // 切换到常规状态 VisualStateManager.GoToState(verticalScrollBar, "Normal", true); // 监听布局更新,防止系统切回紧凑状态 verticalScrollBar.LayoutUpdated += (s, args) => { VisualStateManager.GoToState(verticalScrollBar, "Normal", true); }; } } // 辅助方法:遍历视觉树查找指定名称的子控件 private T FindVisualChild<T>(DependencyObject parent, string controlName) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is T targetControl && (child as FrameworkElement)?.Name == controlName) { return targetControl; } var foundChild = FindVisualChild<T>(child, controlName); if (foundChild != null) { return foundChild; } } return null; }
记得在XAML里给DataGrid绑定Loaded事件:
<DataGrid x:Name="dataGrid" Loaded="DataGrid_Loaded" VerticalScrollBarVisibility="Visible"/>
注意事项
- 样式修改法更稳定,不会出现状态被系统重置的情况,但需要维护自定义样式,若后续DataGrid控件更新,可能需要同步调整样式。
- 代码法更灵活,无需修改样式,但要处理
LayoutUpdated事件来维持状态。
内容的提问来源于stack exchange,提问作者Flarosa
相关产品推荐
相关产品推荐

