[英]Stretch last DataGrid column
我正在嘗試實現一種自動拉伸最后一列的方法。 我創建了新類FancyDataGrid
並定義了一個名為StretchLastColumnProperty
的DependencyProperty
。 當它為真時,以下方法由LayoutUpdated
事件觸發:
private void StretchLastColumnToTheBorder()
{
var widthSum = 0d;
for (int i = 0; i < Columns.Count; i++)
{
widthSum += Columns[i].ActualWidth;
if (i == Columns.Count - 1 && this.ActualWidth > widthSum)
{
var newWidth = Math.Floor(Columns[i].ActualWidth + (this.ActualWidth - widthSum)) -
(this.BorderThickness.Left + this.BorderThickness.Right);
Columns[i].Width = new DataGridLength(newWidth, DataGridLengthUnitType.Pixel);
}
}
}
雖然此方法適用於小型DataGrid
,但如果此網格足夠高以具有垂直滾動條,則效果不佳。 在這種情況下,最后一列變得太寬,差異不僅僅是滾動條寬度。
我的方法有什么問題? 如何調整最后一列的寬度,將滾動條寬度考慮在內?
編輯:將最后一列的寬度設置為星號僅在最初有效。 調整列大小后,將不再調整其寬度。
我查看了DataGrid
模板的層次結構並注意到,內部ColumnHeadersPresenter
具有視口的寬度( DataGrid
寬度減去左右邊框減去垂直滾動條寬度)。 因此,使用此問題中的方法,您可以找到此元素並獲取其寬度:
public double? ViewPortWidth
{
get
{
return FindChild<DataGridColumnHeadersPresenter>(this, "PART_ColumnHeadersPresenter")?.ActualWidth;
}
}
然后使用它來計算所需的寬度:
private void StretchLastColumnToTheBorder()
{
if (ViewPortWidth.HasValue)
{
var widthSum = 0d;
for (int i = 0; i < Columns.Count; i++)
{
if (i == Columns.Count - 1 && ViewPortWidth > widthSum + Columns[i].MinWidth)
{
var newWidth = Math.Floor(ViewPortWidth.Value - widthSum);
Columns[i].Width = new DataGridLength(newWidth, DataGridLengthUnitType.Pixel);
return;
}
widthSum += Columns[i].ActualWidth;
}
}
}
請注意,如果您拉伸左列,最后一列將在開始向右移動(移出視口)之前縮小到其MinWidth
,從而顯示水平滾動條。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.