调整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);
}