调整宽度与文本宽度成比例的WPF listview列的大小

时间:2012-07-09 15:36:01

标签: wpf listview resize

我有一个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;
    }
}

但是,这仅根据标题文本宽度调整大小;我不知道如何获得标题和行的最大宽度。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这是我正在做的事情。希望这可以帮助。您可以在ListView中获取或设置GridView列的宽度,我使用ListView控件本身的宽度来增加/减少每个ListView列的相对宽度,以按比例填充空间 - 然后扩展最后一列。

您可以做的是修改我的代码,以便在条件" if(total_width< e.NewSize。)中的列集中按比例分配列的总宽度和ListView的宽度之间的差异。宽度"我只是将该差异添加到最后一列宽度。

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);
    }
相关问题