调整WPF列表视图列的宽度与文本宽度成正比

问题描述:

我有一个WPF ListView表,默认大小列标题的宽度每个标题的文本。这不会均匀地填满整个表格;我左边有一堆挤压的柱子,右边有一个空的空间。调整WPF列表视图列的宽度与文本宽度成正比

我希望能够将列的大小调整为与列的文本中的最长项目(标题或行)成比例的宽度。我将如何做到这一点?

什么我目前做的是首先调整的标头的宽度成正比的标头的文本,使用下面的代码(其中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; 
    } 
} 

然而,这只是重新调整基础上,标题文字宽度;我不知道如何获得标题和行的最大宽度。有什么建议么?

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

你可以做的是修改我的代码,以便在条件“if(total_width < e.NewSize.Width”)中按比例分配列的总宽度和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); 
    }