如何解决如何按比例调整WPF Listview的大小?
| 我在调整Listview控件的大小时遇到了一些问题。我打算根据窗口的实际大小按比例调整大小。 对于Listview的初始大小,它是300 X 600(宽度X高度),以像素为单位。我还将其maxHeight设置为750,但其宽度保持不变,即300。 另外,在Wondow的属性中,我已将SizetoContent属性更改为WidthAndHeight,正如某些线程所建议的那样,您可以在调整窗口大小后让系统确定控件的适当大小。 但是,它尚无法正常工作。所以我在这里寻求帮助。谢谢。 附言无论如何,我们可以在WPF中设置宽度和高度的百分比值吗?如果允许使用百分比,例如高度= 80%,那会容易得多。 编辑: 更清楚地说,这是xaml中的常规代码结构<Grid Height=\"Auto\">
<Grid.RowDeFinitions>
<RowDeFinition Height=\"Auto\" />
<RowDeFinition Height=\"50\" />
</Grid.RowDeFinitions>
<Grid.ColumnDeFinitions>
<ColumnDeFinition Width=\"Auto\" />
</Grid.ColumnDeFinitions>
<StackPanel Grid.Row=\"0\" Orientation=\"Horizontal\" Height=\"Auto\" Margin=\"0\">
<ListView />
</StackPanel>
<StackPanel Grid.Row=\"1\" Orientation=\"Horizontal\" Height=\"Auto\" Margin=\"0\">
<Label />
<Button />
</StackPanel>
</Grid>
如您所见,我当前正在使用2个堆栈面板并将它们放在单独的行中。但是,即使我更改为,Listview仍无法按比例调整大小。
解决方法
将您的ListView放在网格内,并对列使用\“ * \”宽度功能:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=\"4*\" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ListView Grid.Column=\"0\">...</ListView>
</Grid>
在此示例中,列0的宽度为\“ 4 * \”,列1的默认宽度为\“ 1 * \”。这意味着它们之间的宽度为“五颗星”,而列0占据了其中的四个。这给您80%的宽度。
, 仅供参考,我发现可行
这是一个可以与ListView一起使用的值转换器,并允许星形列大小调整
从文章:
/// <summary>
/// Calculates the column width required to fill the view in a GridView
/// For usage examples,see http://leghumped.com/blog/2009/03/11/wpf-gridview-column-width-calculator/
/// </summary>
public class WidthConverter : IValueConverter {
/// <summary>
/// Converts the specified value.
/// </summary>
/// <param name=\"value\">The parent Listview.</param>
/// <param name=\"type\">The type.</param>
/// <param name=\"parameter\">
/// If no parameter is given,the remaning with will be returned.
/// If the parameter is an integer acts as MinimumWidth,the remaining with will be returned only if it\'s greater than the parameter
/// If the parameter is anything else,it\'s taken to be a percentage. Eg: 0.3* = 30%,0.15* = 15%
/// </param>
/// <param name=\"culture\">The culture.</param>
/// <returns>The width,as calculated by the parameter given</returns>
public object Convert(object value,Type type,object parameter,CultureInfo culture) {
if(value == null) return null;
ListView listView = value as ListView;
GridView grdView = listView.View as GridView;
int minWidth = 0;
bool widthIsPercentage = parameter != null && !int.TryParse(parameter.ToString(),out minWidth);
if(widthIsPercentage) {
string widthParam = parameter.ToString();
double percentage = double.Parse(widthParam.Substring(0,widthParam.Length - 1));
return listView.ActualWidth * percentage;
} else {
double total = 0;
for(int i = 0; i < grdView.Columns.Count - 1; i++) {
total += grdView.Columns[i].ActualWidth;
}
double remainingWidth = listView.ActualWidth - total;
if(remainingWidth > minWidth) { // fill the remaining width in the ListView
return remainingWidth;
} else { // fill remaining space with MinWidth
return minWidth;
}
}
}
public object ConvertBack(object o,CultureInfo culture) {
throw new NotSupportedException();
}
}
如果您不带参数调用它,它将占用ListView中的剩余宽度:
// fills remaining width in the ListView
<GridViewColumn Width=\"{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListView}},Converter={StaticResource WidthConverter}}\">
如果您使用整数作为参数,则该值将作为最小宽度
// fills remaining width in the ListView,unless the remaining width is less than the parameter
<GridViewColumn Width=\"{Binding RelativeSource={RelativeSource FindAncestor,Converter={StaticResource WidthConverter},ConverterParameter=200}\">
或者,您可以使用星号指定GridView类型的宽度,然后将返回ListView的百分比宽度
// calculates 30% of the ListView width
<GridViewColumn Width=\"{Binding RelativeSource={RelativeSource FindAncestor,ConverterParameter=0.3*}\">
, 这就是我用来按比例调整WPF 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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。