更改Listview中的确切滚动位置

Tok*_*ans 3 c# wpf

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

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

ListView.Scrollposition.Y = some value;
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

She*_*dan 6

使用该ListView元素无法做到这一点.相反,您需要访问它ScrollViewer,然后您可以使用ScrollViewer.ScrollToVerticalOffset方法来设置的垂直位置ScrollViewer.您还需要使用ScrollViewer.VerticalOffset,ScrollViewer.VerticalOffset,ScrollViewer.ViewportHeightScrollViewer.ExtentHeight性能来衡量你在哪里的ScrollViewer.

从MSDN上的ScrollViewer页面:

包含ScrollViewer所有内容的区域是范围.内容的可见区域是视口.

最后,你怎么得到ScrollViewerListView?我不能保证这会在a上工作ListView,但它会在a上工作ListBox.你可以使用VisualTreeHelper.GetChild方法深入研究它的可视树,ListView它应该包含a Border然后是ScrollViewer,所以你应该能够做到这样的事情:

Border border = (Border)VisualTreeHelper.GetChild(YourListView, 0);
ScrollViewer scrollViewer = VisualTreeHelper.GetChild(border, 0) as ScrollViewer;
if (scrollViewer != null)
{
    scrollViewer.ScrollToVerticalOffset(60.0);
}
Run Code Online (Sandbox Code Playgroud)

如果你确实得到了GetChild方法返回的错误,那么通过调试它就很容易调整.只需在那里放一个断点,看看每个子类型是什么,并添加另一行与其中一个元素...最终,它应该找到ScrollViewer.但是,我认为该代码应该没问题.


dko*_*ozl 5

如果它是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;
}
Run Code Online (Sandbox Code Playgroud)

当你找到它然后你就可以 ScrollToVerticalOffset

var sw = FindScrollViewer(listView);
if (sw != null) sw.ScrollToVerticalOffset(x);
Run Code Online (Sandbox Code Playgroud)