2010-12-17 60 views
8

我正在努力使應用程序很好地從墓碑中回來。該應用程序包含大型列表框,所以我最好喜歡在用戶滾動列表框時滾動回到用戶所在的位置。在Windows Phone 7中恢復列表框的確切滾動位置

很容易跳回到一個特定的SelectedItem - 不幸的是,我的應用從來不需要用戶真正選擇一個項目,他們只是滾動瀏覽它們。我真正想要的是某種MyListbox.ScrollPositionY,但似乎並不存在。

任何想法?

克里斯

回答

10

你需要得到所使用的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