WPF DataGrid滚动条外观



我有一个从DataGrid派生的类,它拉伸最后一列,如果它右边有可用空间:

public double? ViewPortWidth 
{ 
get 
{
return FindChild<DataGridColumnHeadersPresenter>(this, "PART_ColumnHeadersPresenter")?.ActualWidth;
} 
}
private void StretchLastColumnToTheBorder()
{
if (IsLoaded && ViewPortWidth.HasValue)
{
var widthSum = 0d;
for (int i = 0; i < Columns.Count; i++)
{
if (i == Columns.Count - 1 && ViewPortWidth > widthSum + Columns[i].ActualWidth)
{
var newWidth = Math.Floor(ViewPortWidth.Value - widthSum);
Columns[i].Width = new DataGridLength(newWidth, DataGridLengthUnitType.Pixel);
return;
}
widthSum += Columns[i].ActualWidth;
}
}
}

一旦LayoutUpdated被激发,就会调用StretchLastColumnToTheBorder()。一切都很好,除非表中有足够的行来显示垂直滚动条。显然,它不是在加载DataGrid之后立即出现的,导致错误的宽度计算。如何检查垂直滚动条是否已初始化?

EDIT:Width="Auto"调整列的大小以适应其最长的单元格。Width="*"仅设置要拉伸到末尾的列的初始宽度。然而,若你们收缩任何一列,最后一列后面就会出现空白。

如果获得DataGridScrollViewer,则可以检查ComputedVerticalScrollBarVisibility属性。

Loaded处理程序中订阅LayoutUpdated解决了这个问题。在这种情况下,IsLoaded检查也是多余的。因此,拥有

public FancyDataGrid() : base()
{
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
LayoutUpdated += OnLayoutUpdated;
}

而不是

public FancyDataGrid() : base()
{
LayoutUpdated += OnLayoutUpdated;
}

允许在相对于垂直滚动条进行计算时访问视口。

最新更新