2010-12-17 13 views
8

Pracuję nad poprawnym odtwarzaniem aplikacji z nagrobków. Aplikacja zawiera duże pola listy, więc chciałbym przewinąć z powrotem do miejsca, w którym znajdował się użytkownik, gdy przewijają listy.Przywracanie dokładnego położenia przewijania listy w Windows Phone 7

Łatwo jest przeskoczyć z powrotem do konkretnej SelectedItem - niestety dla mnie moja aplikacja nigdy nie wymaga od użytkownika wybrania elementu, tylko przewija je. To, czego naprawdę chcę, to coś w rodzaju MyListbox.ScrollPositionY, ale wydaje się, że nie istnieje.

Wszelkie pomysły?

Chris

Odpowiedz

10

Musisz zdobyć na ScrollViewer, który jest używany przez ListBox wewnętrznie więc można pobrać wartość właściwości VerticalOffset a następnie wywołać metodę SetVerticalOffset.

Wymagane jest przejście od ListBox przez drzewo wizualne, które tworzy jego elementy wewnętrzne.

Używam tego poręczny klasę przedłużacza, który należy dodać do projektu (Muszę położyć się na tym blogu, bo go powtarzać): -

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); 
     } 
    } 
} 

Z tego udostępnienia ListBox (i wszystkie inne UIElements w tej sprawie) otrzymuje kilka nowych metod rozszerzenia Descendents i Ancestors. Możemy połączyć te z Linq, aby wyszukać rzeczy. W takim przypadku możesz użyć: -

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

Dziękuję uprzejmie! Nawet nie zdawałem sobie sprawy, że makijaż kontrolny może być nawigowany w ten sposób. –

+0

, więc skąd wiadomo, kiedy używać tych informacji? W jaki sposób strona wie, że została przywrócona z tombstoningu, nie przeskakując przez kilka obręczy? – Roger

+0

@Roger: Czytałem na ten temat MSDN: http://msdn.microsoft.com/en-us/library/ff967548(v=VS.92).aspx – AnthonyWJones

Powiązane problemy