如何按比例调整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);
    }
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...