更改Listview中的确切滚动位置

时间:2014-01-29 21:01:23

标签: c# wpf

一直在网上搜索答案,但我没有找到任何可以做到这一点:

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

ListView.Scrollposition.Y = some value;

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

感谢。

2 个答案:

答案 0 :(得分:6)

使用ListView元素无法做到这一点。相反,您需要访问其ScrollViewer,然后您可以使用ScrollViewer.ScrollToVerticalOffset Method设置ScrollViewer的垂直位置。您还需要使用ScrollViewer.VerticalOffsetScrollViewer.VerticalOffsetScrollViewer.ViewportHeightScrollViewer.ExtentHeight属性来衡量您在ScrollViewer中的位置。

来自MSDN上的ScrollViewer Class页:

  

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

最后,您如何从ScrollViewer获得ListView?我不能保证这会在ListView上有效,但在ListBox上有效。您可以使用VisualTreeHelper.GetChild Method深入研究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。但是,我认为该代码应该没问题。

答案 1 :(得分: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;
}

当你找到它时,你可以ScrollToVerticalOffset

var sw = FindScrollViewer(listView);
if (sw != null) sw.ScrollToVerticalOffset(x);