2010-12-17 10 views
8

Estoy trabajando para hacer que una aplicación vuelva muy bien de ser desechada. La aplicación contiene grandes cuadros de lista, por lo que idealmente me gustaría volver a desplazarme a donde estaba el usuario mientras se desplazaban por esos cuadros de lista.Restauración de la posición de desplazamiento exacta de un cuadro de lista en Windows Phone 7

Es fácil regresar a un SelectedItem en particular - desafortunadamente para mí, mi aplicación nunca necesita que el usuario seleccione un ítem, simplemente está desplazándose a través de ellos. Lo que realmente quiero es algún tipo de MyListbox.ScrollPositionY, pero parece que no existe.

¿Alguna idea?

Chris

Respuesta

10

Necesitas controlar la ScrollViewer que se utiliza por el ListBox internamente para que pueda tomar el valor de la propiedad VerticalOffset y posteriormente llamar al método SetVerticalOffset.

Esto requiere que alcance desde el ListBox a través del árbol visual que compone su interior.

que utilizan esta clase práctica extensión que se debe agregar al proyecto (Tengo que poner esto en un blog porque sigo repitiéndolo): -

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

Con esta disposición el ListBox (y todos los demás elementos UIE para ese asunto) recibe un par de nuevos métodos de extensión Descendents y Ancestors. Podemos combinarlos con Linq para buscar cosas. En este caso, puede usar: -

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

¡Gracias amablemente! Ni siquiera me di cuenta de que el maquillaje de los controles podía ser navegado de esta manera. –

+0

entonces, ¿cómo sabes cuándo usar esa información? ¿Cómo sabe una página que está siendo restaurada de un tumulto sin saltar a través de un montón de aros? – Roger

+0

@Roger: He leído sobre este tema de MSDN: http://msdn.microsoft.com/en-us/library/ff967548(v=VS.92).aspx – AnthonyWJones