ListView - 计算实际可用区域

时间:2011-06-29 12:31:03

标签: c# wpf wpf-controls

我正在使用此方法调整ListView的大小,将其列调整到每个所需的空间,并将剩余空间添加到第二列,这样就不会出现水平滚动条。

    private void SetColumnWidths(object sender)
    {
        ListView listView = (sender as ListView);

        if (listView != null)
            if (listView.IsLoaded)
            {
                listView.UpdateLayout();

                GridView gridView = listView.View as GridView;

                if (gridView != null)
                {
                    UpdateColumnWidths(gridView);

                    listView.UpdateLayout();

                    Decorator border = VisualTreeHelper.GetChild(listView, 0) as Decorator;

                    if (border != null)
                    {
                        ScrollViewer scroller = border.Child as ScrollViewer;

                        if (scroller != null)
                        {
                            ItemsPresenter presenter = scroller.Content as ItemsPresenter;

                            if (presenter != null)
                            {
                                double columnWidth = presenter.ActualWidth - 2;

                                for (int i = 0; i < gridView.Columns.Count; i++)
                                {
                                    if (i != 1)
                                        columnWidth -= gridView.Columns[i].ActualWidth;
                                }

                                if (columnWidth < 0)
                                    columnWidth = 0;

                                gridView.Columns[1].Width = columnWidth;
                            }
                        }
                    }
                }
            }
    }

    private void UpdateColumnWidths(GridView gridView)
    {
        foreach (var column in gridView.Columns)
        {
            if (double.IsNaN(column.Width))
            {
                column.Width = 0;
                column.Width = double.NaN;
            }
        }
    }

一切正常......直到BorderThickness来到城镇,无论是ListView还是最差的ListViewItem模板。我希望你帮助我的是如何检索ListViewItem模板的BorderThickness,这样我就可以在不包含它的情况下启动调整大小的过程。

或者甚至更好的是你有什么其他想法我怎么能找出ListView的实际可用区域,没有边框,滚动条,鼠标,猫,狗等?

提前谢谢!

2 个答案:

答案 0 :(得分:0)

为什么不设置第二列宽= *而所有其他列宽= Auto?这将使所有列占用他们需要的空间,第二列将占用所有剩余空间。

答案 1 :(得分:0)

我没有找到任何其他解决方案,而是将我的ListViewItem模板中的边框厚度设置为0,左右两侧。有了这个我的列大小调整是好的。不是最好的解决方案,但确定......