好的,这真让我疯了,我需要一些帮助。
我有一个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而不是代码。我只是在玩这个时间超过我承认并且我迷失了。
除了退出尝试之外,任何人都知道我应该做些什么?
答案 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;
}