silverlight - Windows Phone 7: ¿Tombstoning con URI?
windows-phone-7 (1)
Los datos transitorios generalmente se almacenan en el diccionario de estado provisto por la clase PhoneApplicationService . 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, cuidando así de Tombstoning
HTH, indyfromoz
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.
Sin embargo, no estoy muy seguro de cómo hacer esto. Estaba pensando en guardar NavigationContext.QueryString
en el diccionario de 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 la respuesta de indyfromoz , me gustaría implementar lo siguiente
OnNavigatedToHandler()
{
// save NavigationContext.QueryString in the State dictionary
}
Para reducir la redundancia, pensé que implementaría esto en una clase que hereda de PhoneApplicationPage
, y luego tendría el resto de mis páginas heredadas 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 hacer esto?
Actualización 2 : Esto es lo que estoy pirateando juntos ahora en la página principal de mi aplicación (la que se navega al inicio):
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 feo.
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, no parece estar funcionando. 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"?