更改Listview中的确切滚动位置

一直在网上搜索答案,但我没有发现任何这样的事情:

我想以编程方式更改WPF列表中的确切位置。 有些说法

ListView.Scrollposition.Y = some value; 

我唯一能找到的是将值更改为Listview中的对象,而不是特定的坐标。 如果有人在这个主题上有一些好文章或post,我将非常感激!

谢谢。

使用ListView元素无法做到这一点。 相反,您需要访问其ScrollViewer ,然后您可以使用ScrollViewer.ScrollToVerticalOffset方法设置ScrollViewer.ScrollToVerticalOffset的垂直位置。 您还需要使用ScrollViewer.VerticalOffsetScrollViewer.VerticalOffsetScrollViewer.ViewportHeightScrollViewer.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);