2011-01-07 31 views
13

Estoy usando un control panorámico en una aplicación WP7. Uno de los elementos PanoramaItems lo lleva a otra página, que luego le permite enviar un correo electrónico a través de EmailComposeTask. Si no selecciona enviar el correo electrónico y presiona el botón Atrás, Panorama regresa al ítem que seleccionó por última vez. Sin embargo, si selecciona enviar un correo electrónico (y por lo tanto deja la aplicación), no regresa al PanoramaItem previamente seleccionado. En cambio, vuelve al primer elemento en Panorama. Intenté hacer un seguimiento del índice seleccionado y configurarlo, pero recibí un error que decía que SelectedIndex no es configurable. Esto se confirma en la documentación de MSDN http://msdn.microsoft.com/en-us/library/microsoft.phone.controls.panorama.selectedindex%28VS.92%29.aspxCómo establecer programáticamente el elemento Panorama seleccionado en WP7

¿Hay alguna manera de configurar manualmente el índice/elemento seleccionado en una panorámica? Si no, ¿hay alguna forma de recordar lo que se seleccionó, incluso si el usuario deja la aplicación para redactar un correo electrónico?

+0

Actualizado con aclaración en mi último comentario sobre DefaultItem. –

+0

He respondido esto aquí: http://stackoverflow.com/questions/17980606/how-to-smoothly-navigate-to-a-different-panorama-item/27018310#27018310 – Rivenfall

Respuesta

34

No estoy seguro si puede forzar programáticamente una animación a otra PanoramaItem, pero puede cambiar la Panorama.DefaultItem.

lo que podría tener 3 PanoramaItem 's y en el manejador OnNavigatedTo(), cambiar el elemento predeterminado a través de:

panoramaControl.DefaultItem = panoramaControl.Items[indexToSet]; 

Esto debería ayudar cuando se recupera de una lápida.

+1

navega correctamente, pero ¿cómo podemos agregue el efecto de animación mientras navega por – 1Mayur

+0

, esto cambia la posición de inicio del título de panorama. Tal vez sea porque tengo una plantilla de encabezado personalizado aplicado. – Rivenfall

7

Puede probar la solución publicada por Silicon Shark en este hilo. Se ha observado que funciona, pero solo en la pantalla inicial, lo que no debería ser un problema para sus requisitos de restaurar el estado después de un tumulto.

How to programmatically set the visible item in a Panorama control?

Usted puede obtener la página actualmente activa de propiedad SelectedIndex del panorama.

Desafortunadamente, la configuración de DefualtItem es solo una aproximación para resolver este problema, que ya puede haber descubierto.

Editar: Tenga en cuenta que al establecer DefaultItem, cambia qué página del panorama es la primera página. Es una diferencia sutil, pero verás cómo importa mirar el posicionamiento del encabezado y el ajuste de la imagen de fondo.

2

Establecer nuevo elemento seleccionado

pan.SetValue(Panorama.SelectedItemProperty, pan.Items[newSelectedItem]); 

Sin embargo, funciona sólo en la inicial por lo que mi idea es dejar que el control de panorama re-init cuando se cambia el elemento seleccionado. Este es mi código, simplemente agregue esto después de cambiar Panorama.SelectedItem.

(pan.Items[curIndex] as PanoramaItem).Visibility = Visibility.Collapsed; 
pan.SetValue(Panorama.SelectedItemProperty, pan.Items[(curIndex + 1) % pan.Items.Count]); 
pan.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
(pan.Items[curIndex] as PanoramaItem).Visibility = Visibility.Visible; 

¡Pero no hay efecto de transición ahora! Aunque, puedes crearte a ti mismo.

Es un gran trabajo para mí, esta página también crear un efecto de deslizamiento derecho http://xme.im/slide-or-change-panorama-selected-item-programatically

3

Probé soluciones aquí enumeradas sin éxito. ¡Esto es lo que hice que funciona como un encanto!

PanoramaItem panItem = (PanoramaItem)panorama.Items[1]; 

panorama.Items.Remove(panItem); 

panorama.Items.Insert(0, panItem); 

¡Debe quitar el panel de la lista y volver a insertarlo en la posición deseada!

5

Aquí hay una solución.Funciona como se esperaba y no reorganiza su panorama, por lo que su interfaz de usuario es coherente.

pan.SetValue(Panorama.SelectedItemProperty, panoramaItem); 
Panorama temp = pan; 
LayoutRoot.Children.Remove(pan); 
LayoutRoot.Children.Add(temp); 
LayoutRoot.UpdateLayout(); 

esto no es una solución perfecta, ya que no se desliza muy bien como panorama debería, y probablemente no es muy eficiente, pero por otro lado no están cambiando el elemento predeterminado para que su interfaz de usuario se mantiene consistente .

+0

Probablemente debería reformular su preámbulo de forma un poco más positiva, porque no creo que me sienta completamente cómodo con su solución, como ahora se lee. – trudyscousin

+0

Este es el método correcto ... lástima que no haya efecto de deslizamiento, pero que no reorganice la interfaz de usuario. +2 de mi parte –

1

Estoy usando este modelo para cambiar a un pivote cuando el dispositivo entra en la vista de paisaje, probablemente termine extrayendo el elemento actual al estado de la aplicación. El panorama es una orientación horizontal de no ir.

private int hub_page_index; 

protected override void OnOrientationChanged(OrientationChangedEventArgs e) 
{ 
    base.OnOrientationChanged(e); 

    if (panorama.Visibility == Visibility.Visible) 
    { 
     hub_page_index = panorama.SelectedIndex; 
    } 
    else if (pivot.Visibility == Visibility.Visible) 
    { 
     hub_page_index = pivot.SelectedIndex; 
    } 

    if (e.Orientation == PageOrientation.Landscape 
    || e.Orientation == PageOrientation.LandscapeLeft 
    || e.Orientation == PageOrientation.LandscapeRight) 
    { 
    // Display Pivot in Landscape orientation 
     pivot.SetValue(Pivot.SelectedItemProperty, pivot.Items[panorama.SelectedIndex]); 
     panorama.Visibility = Visibility.Collapsed; 
     pivot.Visibility = Visibility.Visible; 
    } 
    else 
    { 
     // Display Panorama in Portrait orientation 
     panorama.SetValue(Panorama.SelectedItemProperty, panorama.Items[pivot.SelectedIndex]); 
     pivot.Visibility = Visibility.Collapsed; 
     panorama.Visibility = Visibility.Visible; 
    } 
} 
+0

Agradable. Debe recortar el código para que la solución sea más evidente. Casi salté tu código porque parecía irrelevante, pero resultó para resolver mi problema. –

Cuestiones relacionadas