2

デフォルトで列ヘッダーのサイズを各ヘッダーのテキストの幅に合わせるWPF ListViewテーブルがあります。これはテーブル全体を均等に埋めるわけではありません。左側に押しつぶされた柱の塊があり、右側に空きスペースがあります。

列のテキスト、ヘッダーまたは行の最長の項目に比例する幅に列のサイズを変更できるようにしたいと考えています。どうすればいいですか?

私が現在行っていることは、次のコードを使用して、最初にヘッダーのテキストに比例した幅にヘッダーのサイズを変更することです (SearchResultsTable は ListView です)。

private void Resize()
{
    var width = SearchResultsTable.ActualWidth;
    var gridView = SearchResultsTable.View as GridView;
    var columns = new GridViewColumnCollection();
    if (gridView != null)
    {
        columns = gridView.Columns;
    }
    var initialColumnWidths = columns.Sum(column => column.ActualWidth);
    var scale = width / initialColumnWidths;
    foreach (var column in columns)
    {
        column.Width = column.ActualWidth * scale;
    }
}

ただし、これはヘッダー テキストの幅に基づいてのみサイズ変更されます。ヘッダーと行の最大幅を取得する方法がわかりません。助言がありますか?

4

1 に答える 1

0

これが私がやっていることです。お役に立てれば。ListView で GridView 列の幅を取得または設定できます。ListView コントロール自体の幅を使用して、各 ListView 列の相対的な幅を増減し、スペースを比例的に埋めてから、最後の列を拡張しています。

あなたができることは、列の合計幅と ListView の幅の差を、条件付きの "if (total_width < e.NewSize.Width" を追加する場所で、列のセット全体に比例して分配するようにコードを変更することです。最後の列幅との差。

LV_FileList.SizeChanged += this.onLV_FileList_SizeChanged;

...

    /// <summary>
    /// Proportionally resize listview columns when listview size changes
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void onLV_FileList_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if ((sender is ListView) && 
            (e.PreviousSize.Width > 0))
        {
            double total_width = 0;
            GridViewColumnCollection gvcc = ((GridView)(sender as ListView).View).Columns;
            foreach (GridViewColumn gvc in gvcc)
            {
                gvc.Width = (gvc.Width / e.PreviousSize.Width) * e.NewSize.Width;
                total_width += gvc.Width;
            }

            //Increase width of last column to fit width of listview if integer division made the total width to small
            if (total_width < e.NewSize.Width)
            {
                gvcc[gvcc.Count - 1].Width += (e.NewSize.Width - total_width);
            }

            //Render changes to ListView before checking for horizontal scrollbar
            this.AllowUIToUpdate();

            //Decrease width of last column to eliminate scrollbar if it is displayed now
            ScrollViewer svFileList = this.FindVisualChild<ScrollViewer>(LV_FileList);
            while ((svFileList.ComputedHorizontalScrollBarVisibility != Visibility.Collapsed) &&  (gvcc[gvcc.Count - 1].Width > 1))
            {
                gvcc[gvcc.Count - 1].Width--;
                this.AllowUIToUpdate();
            }
        }
    }


    /// <summary>
    /// Threaded invocation to handle updating UI in resize loop
    /// </summary>
    private void AllowUIToUpdate()
    {
        DispatcherFrame dFrame = new DispatcherFrame();

        Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render, new DispatcherOperationCallback(delegate(object parameter)
        {
            dFrame.Continue = false;
            return null;

        }), null);

        Dispatcher.PushFrame(dFrame);
    }
于 2016-09-12T15:09:28.650 に答える