WPF DataGrid 根据垂直滚动条的显示隐藏控制某列的列宽

问:wpf datagrid 有垂直滚动条时,列A的宽度为100,没有垂直滚动条时,列A的宽度为110,需要怎么处理?

Cursor回答:

wpf datagrid 有垂直滚动条时,列A的宽度为100,没有垂直滚动条时,列A的宽度为110,需要怎么处理

可以根据 DataGrid 内部 ScrollViewer 的 ComputedVerticalScrollBarVisibility 动态调整列宽。DataGridColumn 不好直接做 XAML 绑定,推荐在代码后端监听该属性变化并设置列宽。
代码:
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        dg.Loaded += (_, __) => HookScrollBarAndUpdate();
    }

    void HookScrollBarAndUpdate()
    {
        var sv = dg.Template.FindName("DG_ScrollViewer", dg) as ScrollViewer ?? FindVisualChild<ScrollViewer>(dg);
        if (sv == null) return;

        void Apply()
        {
            dg.Columns[0].Width = sv.ComputedVerticalScrollBarVisibility == Visibility.Visible ? 100 : 110; // 列A=索引0
        }

        Apply();

        var dpd = DependencyPropertyDescriptor.FromProperty(
            ScrollViewer.ComputedVerticalScrollBarVisibilityProperty, typeof(ScrollViewer));
        dpd.AddValueChanged(sv, (_, __) => Apply());
    }

    static T FindVisualChild<T>(DependencyObject parent) where T : DependencyObject
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            if (child is T t) return t;
            var result = FindVisualChild<T>(child);
            if (result != null) return result;
        }
        return null;
    }
}

1、将 dg 替换为你的 DataGrid 名称。

2、若列A不是第0列,请把 Columns[0] 改为对应索引或通过查找列头匹配。

3、这能在滚动条出现/消失时自动把列A宽度切换为 100/110。

posted @ 2025-08-20 16:10  苏秦与真相  阅读(11)  评论(0)    收藏  举报