Materiales del evento: Christmas Windows Phone Sessions, de Windows Phone 7 a Windows Phone 8

El pasado día 3 dentro de las Christmas Windows Phone Sessions tuve la oportunidad de hablar de migración de aplicaciones a Windows Phone 8 desde la perspectiva de un desarrollador Windows Phone 7. Durante una hora estuvimos viendo temas como:

  • Emuladores
  • Resolución
  • Memoria
  • Modos de ejecución asíncrono
  • Portable Class Libraries

Slides

Demos / Ejemplos de código

https://app.box.com/s/un18dtbaiuuy1whaiqcc

Acceso al evento en diferido

https://msevents.microsoft.com/CUI/EventDetail.aspx?culture=es-ES&EventID=1032572357&CountryCode=ES

Finalmente en este artículo resumo algunos puntos interesantes de la charla, en 5 puntos a tener en cuenta al migrar aplicaciones.

Transferir información entre dos ventanas en Windows Phone

Al desarrollar una aplicación de consola o usando Windows Forms, existen varias maneras de que dos formularios diferentes accedan a la misma información. Se pueden emplear pasando los datos mediante el constructor (consiguiendo una inyección de dependencias de la que ya se ha hablado en este post) o usando variables locales. Para Windows Phone existe además una tercera posibilidad.

En este artículo se verá cómo utilizar las ventajas de la clase NavigationService para poder transferir valores entre dos páginas XAML.

Introducción

La navegación en Windows Phone se basa en la llamada a la clase NavigationService, que es la encargada de ocultar, mostrar pantallas, así como el historial (el botón Back situado en la esquina inferior del dispositivo permite ir a la pantalla anterior de manera automática, aunque este comportamiento se puede sustituir El objetivo es que para movernos por las diferentes páginas XAML no hagamos uso de los constructores. Esto representa un inconveniente, ya que no tenemos una referencia al objeto que se ha creado, con lo cual no podríamos hacer solicitudes a las funciones o propiedades del mismo.

Paso de parámetros

Los parámetros se pasan entre dos páginas XAML de la misma manera que se hace en páginas web, usando la variable query string. Una cadena de consulta se sitúa al final de la ruta del fichero precedido por el simbolo ?, el nombre del campo, el símbolo = y el valor de este. Si se quisieran concatenar, se usaría el símbolo & . Un ejemplo de este uso sería index.html?clave=valor donde index.html es la página a cargar, clave es el nombre del campo, y valor es lo que se quiere transferir.

Para permitir que al hacer click en un botón o cualquier otra acción en Windows Phone, el código C# a usar se muestra en el siguiente ejemplo, donde desde cualquier página se quiere ir a la página PlayerWon.xaml con el parámetro Winner y el valor que se encuentra en la variable Ganador:

int Ganador = 0
NavigationService.Navigate(new Uri("/PlayerWon.xaml?Winner=" + Ganador, UriKind.Relative));

Recepción de parámetros

Para que la página de destino pueda acceder a los datos es necesario primeramente solicitar a la clase si existe la clave, y en caso afirmativo, acceder al valor. Este procesamiento se suele realizar en el método OnNavigatedTo que es el que se ejecuta al navegar hacia la página en la que se encuentre y mostrarla por pantalla. Existe también un método llamado OnNavigatedFrom que se ejecuta en el momento anterior al cambio de página, útil si queremos animar la salida de los elementos de pantalla.

El siguiente código obtiene el valor de la variable Query String para la clave Winner, y si está definida, lo procesa:

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
			string newText = string.Empty;
			if (NavigationContext.QueryString.TryGetValue("Winner", out newText ))
			{
				if (newText.Equals("0"))
				{
					PageTitle.Text = "¡Enhorabuena, has ganado!";
				}
				else
				{
					PageTitle.Text = "Lo siento, has perdido";
		        }

			}
            base.OnNavigatedTo(e);
        }

Conclusiones

La navegación entre pestañas en Windows Phone no se diferencia demasiado al paso por parámetros de páginas web. El único inconveniente es que solamente permite pasar cadenas de caracteres, me queda pendiente seguir investigando para pasar valores más complejos. Es una manera más elegante de pasar parámetros que usar un valor estático de una clase.

Más información:

En MSDN: Navigation Service