我有一个从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="*"
仅设置要拉伸到末尾的列的初始宽度。然而,若你们收缩任何一列,最后一列后面就会出现空白。
如果获得DataGrid
的ScrollViewer
,则可以检查ComputedVerticalScrollBarVisibility
属性。
在Loaded
处理程序中订阅LayoutUpdated
解决了这个问题。在这种情况下,IsLoaded
检查也是多余的。因此,拥有
public FancyDataGrid() : base()
{
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
LayoutUpdated += OnLayoutUpdated;
}
而不是
public FancyDataGrid() : base()
{
LayoutUpdated += OnLayoutUpdated;
}
允许在相对于垂直滚动条进行计算时访问视口。