更改Listview中的确切滚动位置
一直在网上搜索答案,但我没有发现任何这样的事情:
我想以编程方式更改WPF列表中的确切位置。 有些说法
ListView.Scrollposition.Y = some value;
我唯一能找到的是将值更改为Listview中的对象,而不是特定的坐标。 如果有人在这个主题上有一些好文章或post,我将非常感激!
谢谢。
使用ListView
元素无法做到这一点。 相反,您需要访问其ScrollViewer
,然后您可以使用ScrollViewer.ScrollToVerticalOffset
方法设置ScrollViewer.ScrollToVerticalOffset
的垂直位置。 您还需要使用ScrollViewer.VerticalOffset
, ScrollViewer.VerticalOffset
, ScrollViewer.ViewportHeight
和ScrollViewer.ExtentHeight
属性来衡量您在ScrollViewer
。
从MSDN上的ScrollViewer
类页面:
包含ScrollViewer所有内容的区域是范围。 内容的可见区域是视口。
最后,如何从ListView
获取ScrollViewer
? 我不能保证这将在ListView
上工作,但它在ListBox
。 你可以使用VisualTreeHelper.GetChild
方法深入研究ListView
的可视化树,它应该包含一个Border
,然后是ScrollViewer
,所以你应该能够做到这样的事情:
Border border = (Border)VisualTreeHelper.GetChild(YourListView, 0); ScrollViewer scrollViewer = VisualTreeHelper.GetChild(border, 0) as ScrollViewer; if (scrollViewer != null) { scrollViewer.ScrollToVerticalOffset(60.0); }
如果GetChild
方法返回的内容确实出错,可以通过调试来轻松调整。 只需在那里放一个断点,看看每个子类型是什么,并添加另一行与其中一个元素…最终,它应该找到ScrollViewer
。 但是,我认为该代码应该没问题。
如果它是ListView
那么首先你需要找到ScrollViewer
:
private ScrollViewer FindScrollViewer(DependencyObject d) { if (d is ScrollViewer) return d as ScrollViewer; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(d); i++) { var sw = FindScrollViewer(VisualTreeHelper.GetChild(d, i)); if (sw != null) return sw; } return null; }
当你找到它然后你可以ScrollToVerticalOffset
var sw = FindScrollViewer(listView); if (sw != null) sw.ScrollToVerticalOffset(x);