簡體   English   中英

拉伸最后一個 DataGrid 列

[英]Stretch last DataGrid column

我正在嘗試實現一種自動拉伸最后一列的方法。 我創建了新類FancyDataGrid並定義了一個名為StretchLastColumnPropertyDependencyProperty 當它為真時,以下方法由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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM