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

如何让UWP DataGrid始终显示展开状态的垂直滚动条

UWP DataGrid 永久显示常规垂直滚动条的解决方案

可行,UWP默认的ScrollBar包含紧凑(细线)和常规两种视觉状态,默认仅在鼠标悬停时切换到常规状态。你可以通过以下两种方法实现永久显示常规滚动条:

方法1:重写ScrollBar的样式

UWP的DataGrid内部的垂直滚动条(命名为PART_VerticalScrollBar)默认使用系统ScrollBar样式,带有紧凑状态逻辑。你可以通过修改样式强制它始终处于常规状态:

  1. 在Blend中打开项目,选中DataGrid右键选择「编辑模板」→「编辑副本」,生成完整的DataGrid样式资源。
  2. 在生成的样式中找到内部的PART_VerticalScrollBar控件,为它指定自定义的ScrollBar样式。
  3. 在自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:50:16