问:wpf datagrid 有垂直滚动条时,列A的宽度为100,没有垂直滚动条时,列A的宽度为110,需要怎么处理?
Cursor回答:
可以根据 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。