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

7 pensamientos en “Transferir información entre dos ventanas en Windows Phone

    1. Roberto Luis Bisbé Autor de la entrada

      Solamente puedes pasar parámetros como si fueran los parámetros de una web, en el ejemplo que muestro el nombre del parámetro es Winner y su valor es 0.

      Si sigues teniendo dudas te recomiendo que le eches un vistazo al enlace que hay al final del artículo.
      Un saludo.

      Responder
  1. Hikaru Zoldyck

    perfectamente explicado ahora solo me falta asignarle los valores solo que este metodo o estoy ubicando en OnTap y mi variable de datos esta como resultao de una consulta, est se resolveria volvindolo varible global?. Se agradece.

    Responder
  2. Ed Cardoz

    Pero, ¿ésta comunicación entre ventanas únicamente permite el pase de variables por valor? ¿Se puede también hacer un pase por referencia?

    Responder
    1. Roberto Luis Bisbé Autor de la entrada

      Solamente por valor, ten en cuenta que lo que se genera es una cadena de caracteres al final. Sin embargo creo que con Windows Phone 8 ha cambiado, le echaré un vistazo y si hay cambios, publico un nuevo post. Gracias por el comentario!

      Responder
  3. vagabundo05

    Soy nuevo en esto de programa en Windows Phone y estoy atorado en esto: Tengo un ListBox, el cual va a mostrar informacion que le llega de otra pagina, pero cuando quiero pasar los datos del ListBox a otra al darle click en el boton, no se como seleccionar el o los datos que se van a enviar, espero que alguien me pueda ayudar con esto, este es el ListBox y los datos que se van a mandar son txtNombre y txtFecha

    Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s