在Windows Phone 7中恢复列表框的确切滚动位置

问题描述:

我正在努力使应用程序很好地从墓碑中回来。该应用程序包含大型列表框,所以我最好喜欢在用户滚动列表框时滚动回到用户所在的位置。在Windows Phone 7中恢复列表框的确切滚动位置

很容易跳回到一个特定的SelectedItem - 不幸的是,我的应用从来不需要用户真正选择一个项目,他们只是滚动浏览它们。我真正想要的是某种MyListbox.ScrollPositionY,但似乎并不存在。

任何想法?

克里斯

你需要得到所使用的ListBox内部,所以你可以抓住VerticalOffset属性的值,然后调用SetVerticalOffset方法ScrollViewer的保持。

这要求您通过构成其内部的可视树从ListBox下来。

我用这个方便的扩展类,你应该添加到您的项目(我得把这个了一个博客,因为我不停地重复它): -

public static class VisualTreeEnumeration 
{ 
    public static IEnumerable<DependencyObject> Descendents(this DependencyObject root, int depth) 
    { 
     int count = VisualTreeHelper.GetChildrenCount(root); 
     for (int i = 0; i < count; i++) 
     { 
      var child = VisualTreeHelper.GetChild(root, i); 
      yield return child; 
      if (depth > 0) 
      { 
       foreach (var descendent in Descendents(child, --depth)) 
        yield return descendent; 
      } 
     } 
    } 

    public static IEnumerable<DependencyObject> Descendents(this DependencyObject root) 
    { 
     return Descendents(root, Int32.MaxValue); 
    } 

    public static IEnumerable<DependencyObject> Ancestors(this DependencyObject root) 
    { 
     DependencyObject current = VisualTreeHelper.GetParent(root); 
     while (current != null) 
     { 
      yield return current; 
      current = VisualTreeHelper.GetParent(current); 
     } 
    } 
} 

有了这个可用ListBox(和所有其他UIElements)获得几个新的扩展方法DescendentsAncestors。我们可以将这些与Linq结合起来寻找东西。在这种情况下,您可以使用: -

ScrollViewer sv = SomeListBox.Descendents().OfType<ScrollViewer>().FirstOrDefault(); 
+0

谢谢亲切!我甚至没有意识到控制系统的化妆可以通过这种方式进行导航。 – 2010-12-22 20:08:50

+0

所以你怎么知道什么时候使用这些信息?如何知道它是从墓碑恢复而不是跳过一堆箍? – Roger 2011-06-12 23:01:28

+0

@Roger:已阅读此MSDN主题:http://msdn.microsoft.com/en-us/library/ff967548(v=VS.92).aspx – AnthonyWJones 2011-06-13 12:12:27