如何使WPF ListView缩小?

时间:2011-04-01 18:19:19

标签: wpf layout

好的,这真让我疯了,我需要一些帮助。

我有一个listview,其中包含一个包含多个gridviewcolumns的itemssource。设置ItemsSource后,列大小将适合内容。

每当我通过抓住列来增加宽度时,它会使listview增长,但是当我减小宽度时,不会缩小。根据{{​​3}},这是每个WPF布局过程。

我将ListView子类化以覆盖此行为,并且无法使其正常工作。

我已经覆盖了MeasureOverride函数,如下所示:

    protected override Size MeasureOverride(Size constraint)
    {
            var size = base.MeasureOverride(constraint);

            var gv = this.View as GridView;

            if (gv != null)
            {
                var width = gv.Columns.Select(a => a.ActualWidth).ToArray();
                size.Width = gv.Columns.Sum(a => a.ActualWidth) ;
                if (scroll.ScrollableHeight > 0)
                    size.Width += SystemParameters.ScrollWidth;
            }

            return size;
    }

这会导致列表视图按需缩小,但如果列表视图有垂直滚动条则会消失。 我无法弄清楚如何让滚动条以编程方式返回。

现在,如果我将宽度增加到超过原始宽度,则滚动条会回来(但这是通过UI而不是代码。我只是在玩这个时间超过我承认并且我迷失了。

除了退出尝试之外,任何人都知道我应该做些什么?

3 个答案:

答案 0 :(得分:0)

我不确定是否有更好的方法,只是最棘手的方法。

如果存在滚动并将listView Width属性绑定到此依赖项属性,则可以在后面的代码上具有依赖项属性,该属性等于所有ListViewColumns的ActualWidth加上滚动宽度的总和。

但是每次列更改大小时,您都必须更新此属性。希望不是经常这样。

答案 1 :(得分:0)

如果我没有弄错的话,ListView有自己的ScrollViewer可以通过附加属性访问,所以如果你想在代码中更改它,你可能需要这样做:

lv.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty,
            ScrollBarVisibility.Visible);

虽然我不知道有多少帮助。

lv是一个ListView实例,如果你在一个子类中,你可能只会使用this

答案 2 :(得分:0)

这甚至是一个问题的原因是因为ScrollViewer的本质,它保持了内容的大小,所以当ListView通过MeasureOverride缩小时,它就是内容仍然保持不变。下面的解决方案并不完美,但它是我能找到的最好的解决方案。如果有更好的,请告诉我。

我到达的解决方案是保持MeasureOverride功能,并覆盖ArrangeOverride,并将ScrollViewer的宽度设置为ListView的最终宽度像这样:

public Size ArrangeOverride(Size arrangeBounds)
{
  var size = base.ArrangeOverride(arrangeBounds);
  var scroll = GetScrollViewer();
  scroll.Width = size.Width;
  return size;
}