2010-11-04 17 views
5

Estoy construyendo una aplicación wp7 en Silverlight. Todo el estado de mi aplicación se almacena en NavigationContext.QueryString. Si esto se pudiera guardar en la desactivación de la aplicación, y esa página navegara hacia la reactivación de la aplicación, eso resolvería mis requerimientos de desecho.Windows Phone 7: ¿Tombstoning con URI?

Sin embargo, no estoy muy seguro de cómo hacer esto. Estaba pensando en guardar NavigationContext.QueryString en el diccionario State en App.xaml.cs::Application_Deactivated(), pero ese código no tiene acceso a NavigationContext.QueryString. ¿Hay otra forma en que puedo hacer esto?

Supongo que podría guardar la cadena de consulta en el diccionario de estado cada vez que navego, luego restaurarla cuando la aplicación se vuelva a activar. ¿O hay un mejor enfoque?

actualización: Basado en indyfromoz 's respuesta, me gustaría poner en práctica el siguiente

OnNavigatedToHandler() 
{ 
    // save NavigationContext.QueryString in the State dictionary 
} 

Reducir la redundancia, que pensé en implementar esto en una clase que hereda de PhoneApplicationPage , luego, todas las demás páginas heredarán de esa clase. Sin embargo, luego aparece el problema de que todas las clases de página son partial porque también están definidas en el código generado. No quiero cambiar el código generado, porque volver a cambiarlo cada vez que se regenera sería un gran dolor.

¿Hay una mejor manera de hacerlo?

Actualización 2: Aquí es lo que estoy hackeando juntos ahora en la página principal de mi aplicación (el que se navega a en el arranque):

public partial class MainPivot : PhoneApplicationPage 
{ 
    public MainPivot() 
    { 
     InitializeComponent(); 
     Loaded += new RoutedEventHandler(MainPivot_Loaded); 
     PhoneApplicationService.Current.Deactivated += new EventHandler<DeactivatedEventArgs>(App_Deactivated); 

     MessageBox.Show("launching main pivot (state count: " + PhoneApplicationService.Current.State.Count + ")"); 
     if (PhoneApplicationService.Current.State.Count != 0) 
     { 
      Debug.Assert(PhoneApplicationService.Current.State.ContainsKey(QueryStringKey), 
       "State is initialized, but contains no value for the query string"); 

      string oldQueryString = (string)PhoneApplicationService.Current.State[QueryStringKey]; 
      MessageBox.Show("Old query string: " + oldQueryString); 
      NavigationService.Navigate(new Uri(oldQueryString)); 
     } 
    } 

    public readonly string QueryStringKey = "queryString"; 

    void App_Deactivated(object sender, DeactivatedEventArgs e) 
    { 
     PhoneApplicationService.Current.State[QueryStringKey] = NavigationService.Source; 
    } 

    // ... 

Funciona (sorta) pero es fea .

Actualización 3: Parece que el sistema operativo wp7 volverá a cargar automáticamente la página correcta en una aplicación basada en página. De hecho, estoy usando páginas, por lo que quizás no necesite mucho trabajo aquí.

Sin embargo, parece que no funciona. Lance la aplicación, vaya a una página, presione "Inicio", luego presione "Atrás". La pantalla dice "Reanudar ..." pero parece colgar allí. ¿Se supone que mi código está respondiendo de alguna manera en este punto? ¿Hay alguna manera de mantener el depurador conectado incluso después de presionar "Comenzar"?

Respuesta

5

Los datos transitorios generalmente se almacenan en el State dictionary provided by the PhoneApplicationService class. Los datos se almacenan en el evento OnNavigatedFrom de la página y se restauran desde el evento OnNavigatedTo de la página. Si almacenó los parámetros del URI de la página en el diccionario de estado dentro del evento OnNavigatedFrom que está disponible en cada página de su aplicación, puede implementar la lógica para leer los parámetros en el evento OnNavigatedTo, ocupándose de Tombstoning

HTH, indyfromoz

+0

Derecha. Para cada página, quiero que el método 'OnNavigatedFrom' sea el mismo: guarde el URI actual en' State'. Quería hacer esto a través de la herencia, pero parece que no puedo, en función del código generado. ¿Hay otra forma en que puedo hacerlo? –

+0

¿Está utilizando MVVM en su aplicación? He utilizado MVVMLight toolkit y he usado la clase Messenger con OnNavigatedFrom/OnNavigatedTo con filtros de mensajes para almacenar datos de manera efectiva desde la aplicación. – indyfromoz

+0

No estoy usando explícitamente MVVM en mi aplicación. ¿MVVMLight está disponible para Windows Phone 7? –