【问题标题】:Resizing WPF listview columns with width proportional to text width调整宽度与文本宽度成比例的 WPF 列表视图列的大小
【发布时间】:2012-07-09 01:09:52
【问题描述】:

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

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

【问题讨论】:

    标签: wpf listview resize


    【解决方案1】:

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

    您可以做的是修改我的代码,以在条件“if (total_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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2015-07-01
      • 2012-07-08
      • 2012-03-24
      相关资源
      最近更新 更多