2014-01-29 117 views
3

被四处撒网的答案寻找,但我没有发现任何东西,这是否:更改完全滚动位置在ListView

我想换一个WPF名单的确切位置IEW编程。某种说法

ListView.Scrollposition.Y = some value; 

我唯一能找到的就是将值更改为Listview中的一个对象,而不是具体的坐标。 如果有人有一些好的文章或这个主题的帖子,我会很感激!

谢谢。

回答

4

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

ScrollViewer Class页上MSDN:

包括所有的ScrollViewer的内容是程度的面积。内容的可见区域是视口。

最后,您如何从ListView获得ScrollViewer?我不能保证这将在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。不过,我认为那个代码应该没问题。

+0

非常深入的答案,我会看看Scrollviewer类,几乎知道它就是它。谢谢你这个美好的回答! :) – Tokfrans

4

如果它是一个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); 
+2

谢谢!非常好的回答:) – Tokfrans

+0

没问题。你没有提到你想要滚动的原因,但你可能也想看看['ListBox.ScrollIntoView'](http://msdn.microsoft.com/zh-cn/library/system.windows.controls.listbox.scrollintoview (v = vs.110).aspx),它可以让你将特定物品放入视图 – dkozl

+0

哦,对不起。我试图在我的Listviews中实现一个动态滚动功能,所以我真的想要一个非常精确的滚动而不是逐项的方式(因为这没有意义) – Tokfrans