Operaciones básicas de programación con Metro y Windows 8 (III)
Navegación entre páginas de una aplicación – Introducción
Navegación entre páginas de una aplicación – Introducción (III)
Pasando datos de una página a otra
Dentro de nuestra página Prueba.xaml.cs observaremos que por defecto, Visual Studio 2012 ha agregado dos métodos, uno de nombre LoadState y otro llamado SaveState.
De momento, vamos a obviar ambos métodos, y vamos a centrar nuestra atención en un evento que por defecto no existe. Hablo del evento OnNavigatedTo.
Para ello, vamos a escribir dentro del código C# de nuestra página, la palabra reservada override y seleccionaremos el método mencionado anteriormente.
Una vez hecho esto, tendremos un código similar al siguiente:
1: protected override void OnNavigatedTo(NavigationEventArgs e)
2: {
3: base.OnNavigatedTo(e);
4: }
Obviamente, deberemos realizar algún ajuste en el contenido de este evento.
Éste quedará de la siguiente forma:
1: protected override void OnNavigatedTo(NavigationEventArgs e)
2: {
3: this.txtSaludo.Text = String.Format("Hola {0}", e.Parameter.ToString());
4: } // OnNavigatedTo
Con esta instrucción, mostraremos en la página Prueba.xaml el contenido del control TextBox que indicamos en la página MainPage.xaml una vez hayamos pulsado el control Button de esta última.
Podemos ejecutar nuestra aplicación pulsando la tecla F5 para ver el resultado obtenido.
Daños colaterales
Sin embargo, nuestra aplicación tiene un daño colateral.
Si ejecutamos nuestra aplicación, observaremos que cuando pulsamos el botón de volver de nuestra página Prueba.xaml, el texto que teníamos en el control TextBox de nuestra página MainPage.xaml ha desaparecido.
Esto es debido a que la página MainPage.xaml no ha sido cacheada, por lo que si queremos que nuestra página principal MainPage.xaml no pierda el contenido indicado en la misma, deberemos ejecutar una sencilla instrucción que permita cachear dicha página.
Para tal fin y dentro del constructor de nuestra página principal (en nuestro caso), vamos a habilitar la opción de cachear la página.
La porción de código de nuestro constructor quedaría de la siguiente manera:
1: public MainPage()
2: {
3: this.InitializeComponent();
4: this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
5: } // MainPage
OnNavigatedTo y OnNavigatedFrom
Otro daño colateral que mucho me temo, se debe a un bug de la versión preliminar de Visual Studio 2012 y sus plantillas (en la versión anterior beta de Visual Studio 2012 no ocurría), es el hecho de que ejecutando nuestra aplicación se produzca una excepción al volver de Prueba.xaml a MainPage.xaml.
Para comprobar esta excepción, ejecute la aplicación desde Visual Studio 2012 pulsando la tecla F5, y escriba un nombre o texto en la caja de texto de MainPage.xaml y pulse el botón correspondiente.
Una vez mostrada la página Prueba.xaml, regrese a la página MainPage.xaml nuevamente.
Observará entonces que se produce una excepción.
El motivo de que se lance esta excepción es que para la clase autogenerada por Visual Studio 2012 llamada LayoutAwarePage.cs, y en su evento OnNavigatedFrom, la variable privada _pageKey vale en este caso null.
Pero antes de continuar repasemos los dos eventos que debemos conocer.
Cabe recordar que hay dos eventos dentro de una página que pueden ser sobre escritos y que tienen los nombres de OnNavigatedTo y OnNavigatedFrom.
Estos dos eventos los utilizaremos para navegar hacia una página o desde una página. En concreto, utilizaremos OnNavigatedTo cuando la página hacia la que se navega se convierte en primer plano, y OnNavigatedFrom cuando se abandona el primer plano.
Es normal y habitual utilizar estos dos eventos para cargar datos o almacenar un contexto determinado al abandonar la página sobre la que se estaba trabajando.
Por lo tanto, y después de lo comentado, lo normal es que se lance OnNavigatedTo y no OnNavigatedFrom. De hecho, el código no entra en OnNavigatedTo. Es por esto que se genera la excepción indicada anteriormente.
Regresando al problema anterior, soy honesto al decir que no tengo del todo claro si la ejecución del código es ahora mismo la correcta o si se debe a algún bug de Visual Studio 2012 y de .NET, pero la siguiente solución que voy a dar al problema con el que nos hemos encontrado resuelve el problema que acabamos de ver, al menos momentáneamente.
Bastaría simplemente con comprobar primero si _pageKey vale null o no, y en el caso de que no valga null, ejecutar la instrucción que da la excepción.
Nuestro código quedaría por lo tanto de la siguiente manera:
1: protected override void OnNavigatedFrom(NavigationEventArgs e)
2: {
3: var frameState = SuspensionManager.SessionStateForFrame(this.Frame);
4: var pageState = new Dictionary<String, Object>();
5: this.SaveState(pageState);
6: if (_pageKey != null)
7: {
8: frameState[_pageKey] = pageState;
9: }
10: } // OnNavigatedFrom
Y hasta aquí lo que podríamos entender como toma de contacto Metro.
En próximas entradas, iremos mejorando algunas de las cosas comentadas y profundizando un poco más en el desarrollo Metro.
One Responseso far
Nota preliminar del autor: Las entradas y subentradas que he elaborado constituyen una toma de contacto