我有一个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;
}
}
但是,这仅根据标题文本宽度调整大小;我不知道如何获得标题和行的最大宽度。有什么建议吗?
答案 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);
}