NESL Extensiones Nativas para Silverlight

Hoy quiero hacer una pausa en el tutorial de Windows Phone para presentaros de una nueva herramienta para nuestros desarrollos Silverlight esta herramienta es NESL, es un framework que nos permite acceder a sensores, speech, taskbar …

Desde su pagina podemos ver todo lo que nos presenta

 

Requisitos de plataforma

  • Sistema operativo Windows 7 32-bit/64-bit

  • Aplicación Silverlight 4 funcionando fuera del navegador con confianza elevada

Disponible en esta descarga

  • Instalador MSI nativo de tiempo de ejecución
  • Derechos para implementar NESL
  • Programa de instalación
  • Código de fuente de las bibliotecas de contenedor de Silverlight
  • Código de fuente de las aplicaciones de ejemplo
  • Documentación API
  • Guía del desarrollador NESL (en camino)

Nos ofrece aplicaciones de ejemplo para poder ver su potencia, no he podido testearlas pero tienen muy buena pinta

 

  • Video Travel Journal – Captura de video, acceso a dispositivos portátiles, integración a la barra de tareas de Windows 7, integración con mapas de Bing e integración con Facebook

TJDemoPic1.pngTJDemoPic2.pngTJDemoPic3.png

  • Where’s Teddy? – Reconocimiento de voz, texto a voz, sensores (acelerómetro y sensor de luz)

CBDemoPic1.pngCBDemoPic2.pngCBDemoPic3.png

Windows Phone –Tutorial VI ApplicationBar y MVVM

En los anteriores artículos de este tutorial hemos visto como iba poniendo botones para la navegación, pero lo lógico en toda aplicación que desarrollemos es que tengamos una barra de botones al estilo que tiene el iphone, solo que en este caso diseñados con la interfaz Metro.

Si abrimos el Xaml de la MainPage que se nos genera al crear un proyecto, podemos observar que hay una parte comentada que se refiere a la ApplicationBar

1 <!-- Sample code showing usage of ApplicationBar 2 <phone:PhoneApplicationPage.ApplicationBar> 3 <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"> 4 <shell:ApplicationBarIconButton x:Name="appbar_button1" IconUri="/Images/appbar_button1.png" Text="Button 1"></shell:ApplicationBarIconButton> 5 <shell:ApplicationBarIconButton x:Name="appbar_button2" IconUri="/Images/appbar_button2.png" Text="Button 2"></shell:ApplicationBarIconButton> 6 <shell:ApplicationBar.MenuItems> 7 <shell:ApplicationBarMenuItem x:Name="menuItem1" Text="MenuItem 1"></shell:ApplicationBarMenuItem> 8 <shell:ApplicationBarMenuItem x:Name="menuItem2" Text="MenuItem 2"></shell:ApplicationBarMenuItem> 9 </shell:ApplicationBar.MenuItems> 10 </shell:ApplicationBar> 11 </phone:PhoneApplicationPage.ApplicationBar> 12 --> 13

 

Si lo descomentamos y ejecutamos nuestra pagina seria

imageimage

 

Los botones aparecen con X porque la imagen asociada no la encuentra, y los puntos corresponde a que existe un menú como podemos observar en la segunda imagen. Los botones no pueden contener cualquier imagen (por poder si), deben de seguir las características de la interfaz metro, os recomiendo leer este articulo de la MSDN Application Bar Best Practices for Windows Phone.

Cuando instalamos las herramientas para el desarrollo de Windows Phone se nos instalan una serie de iconos en el directorio C:Program Files (x86)Microsoft SDKsWindows Phonev7.0Icons, no son muchos pero nos dan una idea.

image

De todas formas podemos crear los nuestros pero deberemos tener en cuenta además de la interfaz su tamaño

image

si no sois ningunos artistas como yo podéis comprar esta serie de 350 iconos por 10$ http://www.billybarker.net/350-mobile-app-icons-for-developers/

image

Una vez que tenemos claro que iconos vamos a utilizar tenemos que tener claro que cuando añadamos las imágenes a nuestro proyecto debemos de poner las propiedades de esa imagen

  • Copy to Output Directory: Always
  • Build Action: Content 

Esta ultima propiedad es importante las imágenes no debemos de ponerla nunca como recurso por temas de rendimiento

image

Cuando referenciamos la imagen como recurso

<Image Source="/WindowsPhoneApplication1;component/Untitled.png" />

Si nos fijamos en el fichero XAP que se genera  y lo abrimos (solo hay que cambiarlo a extensión zip) la imagen no existe en la lista de ficheros, en cambio si lo ponemos como Content, a la hora de referenciarlo es

<Image Source="Untitled.png" />

En este caso aparecerá la imagen dentro del archivo XAP como otro archivo cualquiera pero entre los ficheros XAP observaremos que este ultimo es mucho mas pequeño con lo que la descarga de tu aplicación será mas eficiente, pero también y mas importante que a la hora de inicializarse se cargar mucho mas rápido, así que tendremos que tener cuidado cuando añadamos imágenes porque por defecto y no se porque viene como Resource en vez de Content.

En mi aplicación que voy a coger la de mi anterior articulo solo tendré un botón para navegar a la siguiente pagina

1 <phone:PhoneApplicationPage.ApplicationBar> 2 <shell:ApplicationBar IsVisible="True" IsMenuEnabled="False"> 3 <shell:ApplicationBarIconButton x:Name="appbar_btnNext" IconUri="/Assets/appbar.next.rest.png" Text="Siguiente"> 4 </shell:ApplicationBarIconButton> 5 </shell:ApplicationBar> 6 </phone:PhoneApplicationPage.ApplicationBar> 7

 

Ahora deberíamos de invocarlo con un comando o con trigger asociándole EventToCommand como hemos visto anteriormente, pero en este caso es imposible ya que la clase ApplicationBarIconButton no permite ninguna de estas dos opciones con lo que debemos utilizar el code-behind. Tampoco es un sacrilegio y en este caso es absolutamente necesario

1 <phone:PhoneApplicationPage.ApplicationBar> 2 <shell:ApplicationBar IsVisible="True" IsMenuEnabled="False"> 3 <shell:ApplicationBarIconButton x:Name="appbar_btnNext" Click="appbar_btnNext_Click" IconUri="/Assets/appbar.next.rest.png" Text="Siguiente"> 4 </shell:ApplicationBarIconButton> 5 </shell:ApplicationBar> 6 </phone:PhoneApplicationPage.ApplicationBar> 7

En nuestro code-behind llamaremos al comando que queremos ejecutar

1 private void appbar_btnNext_Click(object sender, System.EventArgs e) 2 { 3 var vm = DataContext as MainViewModel; 4 5 if (vm != null) 6 { 7 vm.NavigatePage2Command.Execute(null); 8 } 9 } 10

Si lo ejecutamos la pantalla nos queda

image

Pero tenemos un problema que no funciona correctamente porque el binding del TextBox no se refresca al pulsar el botón del ApplicationBar así que lo que escribe el usuario no lo recibe la segunda página, como pasaba antes con el botón que al pulsarlo el TextBox perdía el foco y la propiedad UserText tomaba el valor. Esto ocurre también en una aplicación Silverlight la manera de solucionarlo es bien sencilla, refrescando el binding.

1 private void appbar_btnNext_Click(object sender, System.EventArgs e) 2 { 3 BindingExpression expression = txtText.GetBindingExpression(TextBox.TextProperty); 4 expression.UpdateSource(); 5 var vm = DataContext as MainViewModel; 6 7 if (vm != null) 8 { 9 10 vm.NavigatePage2Command.Execute(null); 11 } 12 } 13

 

De esta manera él binding se refresca y nuestra aplicación funciona correctamente

Windows Phone y el desarrollo en Visual Basic

Yo soy un desarrollador de C#, nunca he desarrollado nada en Visual Basic pero me he alegrado enormemente que se haya anunciado a finales de Noviembre la aparición de un add-on para el desarrollo de Windows Phone en Visual Basic. Existen millones de programadores  en Visual Basic .Net para Windows, lo cual abre un recurso potencial para crear aplicaciones para el WP7 y que todos los desarrolladores y clientes de Windows Phone salgamos claramente beneficiados.

Se puede descargar desde aqui

Este add-on, que sólo funciona con Visual Studio 2010 Professional, Premium o Ultimate, no funciona en la versión gratuita de Express, si solo tenéis versión express os recuerdo que está la opción de inscribirse al programa  WebsiteSpark  (software que cede el software  durante 3 años , leer las condiciones de cesión en su web)

Este add-on no soporta XNA pero en algún momento dará soporte para XNA, de acuerdo con el texto encontrado en el archivo “readme”, no hay ningún proyecto de plantillas en Visual Basic disponible para XNA en este momento. Tampoco son soportadas por Expression Blend las aplicaciones desarrolladas en VisualBasic.

Tampoco vamos a poder desarrollar (por ahora) con el framework MVVM Light que tanto os estoy insistiendo.

Parece que todos son problemas, pero hay que decir que es un primer paso por parte de Microsoft para incluir a todos los desarrolladores de Visual Basic en el desarrollo de aplicaciones para Windows Phone y que se vayan introduciendo en este mundo.

También tenemos que decir que aun con estas limitaciones podemos realizar aplicaciones totalmente funcionales para subirlas al marketplace.

Una vez lo hemos instalado vamos a crear una pequeña aplicación en Visual Basic para Windows Phone, veremos como nos sale nuevas plantillas

 

image

 

El proyecto se crea con la estructura

image

Podemos ver que hay diferencias con un  proyecto de c#, no existen los ficheros de propiedades de c# pero en las propiedades del proyecto podemos acceder a las misma propiedades que con los ficheros de c#.

Vamos a realizar una pequeña aplicación con tres botones y un border cuya funcionalidad es que cuando el usuario de a alguno de esos botones el border tendra el color del botón como BackGround. Como podéis ver el IDE es igual que cualquier aplicación hecha en c#.

image

El código de la aplicación seria el de una aplicación Silverlight hecha en Visual Basic

 

1 Partial Public Class MainPage 2 Inherits PhoneApplicationPage 3 4 ' Constructor 5 Public Sub New() 6 InitializeComponent() 7 End Sub 8 9 Private Sub btnRed_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnRed.Click 10 bdColour.Background = New SolidColorBrush(Colors.Red) 11 End Sub 12 13 Private Sub btnGreen_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnGreen.Click 14 bdColour.Background = New SolidColorBrush(Colors.Green) 15 End Sub 16 17 Private Sub btnBlue_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnBlue.Click 18 bdColour.Background = New SolidColorBrush(Colors.Blue) 19 End Sub 20 End Class

Si la ejecutamos tenemos nuestra aplicación de Windows Phone hecha en Visual Basic

image

Desde aquí animamos a todos los desarrolladores de Visual Basic a que se pongan las pilas y empiecen a aprender Windows Phone.

Os aconsejo ver este video de Channel 9

 

http://channel9.msdn.com/Blogs/channel9spain/Crear-una-aplicacin-Windows-Phone-con-Visual-Basic

Windows Phone–Tutorial – Navegación con MVVM Light Toolkit

En el anterior articulo vimos como se podía realizar la navegación entre páginas en un wp7, en el comienzo del tutorial hicimos hincapié en la necesidad de utilizar el patrón MVVM para nuestros desarrollo  y que yo me había decidido por utilizar el framework  MVVM Light Toolkit. En esta entrada implementaremos la navegación entre páginas utilizando MVVM, para ello primero recomiendo leer las entradas:

Una vez que hemos refrescado nuestros conocimientos vamos a crear nuestro proyecto utilizando el template proporcionado por el framework

 

image

Al crear el proyecto nos aparece el mensaje

image

Esto quiere decir que no hemos instalado el hotfix http://blog.galasoft.ch/archive/2010/07/22/mvvm-light-hotfix-for-windows-phone-7-developer-tools-beta.aspx , una vez instalado el mensaje desaparece.

Al crear el proyecto nos lo genera con la siguiente estructura

image

 

Si añadimos la segunda pagina utilizamos el template de view y el de viewModel

 

imageimage

Debemos recordar primero asignar al DataContext de la nueva view el viewmodel que creemos y que por cada ViewModel que creemos debemos de añadirlo al Locator, tal y como vimos en los artículos sobre MVVM.

Si os fijáis en la pagina que nos crea ya viene el titulo de la aplicación y de la página “bindeados” a la viewnodel, tal y como debe ser

1 <StackPanel x:Name="TitlePanel" 2 Grid.Row="0" 3 Margin="24,24,0,12"> 4 <TextBlock x:Name="ApplicationTitle" 5 Text="{Binding ApplicationTitle}" 6 Style="{StaticResource PhoneTextNormalStyle}" /> 7 <TextBlock x:Name="PageTitle" 8 Text="{Binding PageName}" 9 Margin="-3,-8,0,0" 10 Style="{StaticResource PhoneTextTitle1Style}" /> 11 </StackPanel>

Lo que tenemos que hacer ahora es modificar la viewmodel para añadir un RelayComand en nuestro caso le llamaremos NavigatePage2Command y enlazarlo al botón como hacíamos con Command en los ejemplos realizados en los anteriores artículos, pero nos encontraremos con el error

The property ‘Command’ was not found in type ‘Button’.  

Ya que Command no existe en WP7, para que se lance nuestro comando debemos de hacer uso de una clase que nos ofrece el Framework que es EventToComand, esta clase la usaremos para realizar binding entre un evento y un comando directamente en XAML. Para ello debemos añadir nuevos nameespaces a la página

               xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
               xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP7"
            

Estos namespaces corresponde el primero al que nos proporciona la posibilidad de utilizar triggers y el segundo es el que nos ofrece EventToCommand, una vez añadidos, el XAML nos quedaría

1 <!--ContentPanel - place additional content here--> 2 <Grid x:Name="ContentGrid" 3 Grid.Row="1"> 4 5 <TextBox Text="{Binding UserText}" Height="74" HorizontalAlignment="Left" Margin="26,41,0,0" Name="txtText" VerticalAlignment="Top" Width="398" /> 6 <Button Content="Siguiente Página" Height="82" HorizontalAlignment="Left" Margin="88,143,0,0" Name="btnNext" VerticalAlignment="Top" Width="259" > 7 <i:Interaction.Triggers> 8 <i:EventTrigger EventName="Click"> 9 <cmd:EventToCommand Command="{Binding NavigatePage2Command}" /> 10 </i:EventTrigger> 11 </i:Interaction.Triggers> 12 </Button> 13 14 </Grid> 15

 

De esta manera invocamos al comando cuando el usuario pulse el botón, en la viewmodel declarariamos el RelayCommand y lanzaríamos el mensaje.

1 public MainViewModel() 2 { 3 if (IsInDesignMode) 4 { 5 // Code runs in Blend --> create design time data. 6 } 7 else 8 { 9 _userText = string.Empty; 10 NavigatePage2Command = new RelayCommand(NavigatePage2); 11 12 // Code runs "for real" 13 } 14 } 15 16 17 private void NavigatePage2() 18 { 19 Uri navigation = new Uri("/Page2.xaml?text=" + UserText); 20 Messenger.Default.Send<Uri, MainViewModel>(navigation); 21 }

 

En vez de enviar el mensaje podríamos llamar directamente a la página a través de NavegationService, pero haríamos que nuestro ViewModel solo funcionase para Silverlight y WP7 y no para WPF y si queremos ser puros en la implementación del patrón MVVM, en este caso enviamos un mensaje con la Uri a la que queremos navegar. Pero este mensaje quien lo va a recoger? si solo existe la vista MainPage con su ViewModel creada, con lo que nadie va a recoger el mensaje y tratarlo.

Para solventar esto vamos a crear una clase PhoneApplicationPageBase  que derivara de la clase base de las paginas que es PhoneApplicationPage, en esta clase registraremos todos los mensajes comunes a las paginas como en nuestro caso la navegación y los trataremos. Esta clase es muy sencilla

1 public class PhoneApplicationPageBase : PhoneApplicationPage 2 { 3 protected override void OnNavigatedTo(NavigationEventArgs e) 4 { 5 base.OnNavigatedTo(e); 6 RegisterMessages(); 7 } 8 9 protected override void OnNavigatedFrom(NavigationEventArgs e) 10 { 11 base.OnNavigatedFrom(e); 12 UnregisterAll(); 13 } 14 15 internal void RegisterMessages() 16 { 17 RegisterNavigationMessaging(); 18 19 } 20 21 protected void UnregisterAll() 22 { 23 Messenger.Default.Unregister(this); 24 } 25 26 protected void RegisterNavigationMessaging() 27 { 28 Messenger.Default.Register<Uri>(this, "NavigationRequest", Navigate); 29 } 30 31 private void Navigate(Uri uri) 32 { 33 NavigationService.Navigate(uri); 34 } 35 } 36

Si nos fijamos en la clase vemos que en el evento OnNavigateTo registramos los mensajes que queremos tratar y en el evento OnNavigatedFrom los anulamos.

Ahora lo que debemos hacer es que nuestras páginas deriven de esta nueva clase, modificamos el XAML

1 <helper:PhoneApplicationPageBase x:Class="WP7NavigationMVVM.MainPage" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 5 xmlns:helper="clr-namespace:WP7NavigationMVVM.Helper;assembly=WP7NavigationMVVM" 6 xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 7 .........

 

Y el code-behind

 public partial class MainPage : PhoneApplicationPageBase

 

Hemos visto que a la hora de enviar la Uri la enviamos con el párametro en QueryString

  private void NavigatePage2()
        {
            Uri navigation = new Uri("/Page2.xaml?text=" + UserText,UriKind.Relative);
            Messenger.Default.Send(navigation, "NavigationRequest");
       
        }

Pero en el mensaje en vez de enviar una Uri, podemos enviar una clase nuestra que tenga una propiedad que sea la uri a navegar y otra propiedad con un diccionario<string,string> con los querystrings que quieres enviar o …. la estrategia que mas os convenga para pasar parámetros de una página a otra.

Lo que yo voy a hacer es extender la clase PhoneApplicationPageBase con un nuevo método CheckQueryStrings, este método comprobara si la viewmodel de la página contiene propiedades igual al nombre de la QueryString, en nuestro caso en la Page2 tengo la propiedad UserText y el querystring le llamo igual de manera que se lo asignare siempre automáticamente evitándome en cada pagina realizarlo ya que este método lo hará por mi.

1 private void CheckQueryStrings() 2 { 3 var count = this.NavigationContext.QueryString.Count; 4 if (0 == count) return; 5 ViewModelBase vm = null; 6 if (DataContext is ViewModelBase) 7 vm = DataContext as ViewModelBase; 8 else return; 9 10 //Por cada query string lo enlazo a su propiedad de la pagina a la que navego 11 foreach (var queryString in NavigationContext.QueryString) 12 { 13 var propInfo = vm.GetType().GetProperty(queryString.Key); 14 if (null != propInfo) 15 { 16 if (propInfo.PropertyType == typeof(string)) 17 propInfo.SetValue(vm, queryString.Value, null); 18 else if (propInfo.PropertyType == typeof(long?) || propInfo.PropertyType == typeof(long)) 19 propInfo.SetValue(vm, Convert.ToInt64(queryString.Value), null); 20 } 21 } 22 23 } 24

 

De esta manera la navegación la tengo centralizada en una sola clase y cumplo a rajatabla el patrón MVVM, os dejo el códig

 

Windows Phone –Tutorial IV Navegación

En esta entrada vamos a tratar la navegación entre paginas (controles) en Windows Phone, este tema es bien sencillo ya que utiliza la misma forma que Silverlight 3 a través de la clase NavigationService como siempre vamos a realizarlo a través de un ejemplo. Para ello creamos una aplicación como en los anteriores ejemplos.

En esta aplicación vamos a crear dos paginas en el proyecto y vamos a navegar de una a otra, primero aprenderemos sin pasar datos y luego pasando datos de una pagina a otra.

image image

Una vez que tenemos nuestra aplicación con las dos paginas (Main y Page 2) vamos a crear la primera pagina que va a tener un TextBox y un botón con el texto “Siguiente Página”. En la segunda pagina tendremos un TextBlock que recogerá el parámetro enviado por la primera página y un botón que nos devolverá a la página anterior.

 

1 <Grid x:Name="LayoutRoot" Background="Transparent"> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="Auto"/> 4 <RowDefinition Height="*"/> 5 </Grid.RowDefinitions> 6 7 <!--TitlePanel contains the name of the application and page title--> 8 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 9 <TextBlock x:Name="ApplicationTitle" Text="Navegación" Style="{StaticResource PhoneTextNormalStyle}"/> 10 <TextBlock x:Name="PageTitle" Text="Pagina 1" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 11 </StackPanel> 12 13 <!--ContentPanel - place additional content here--> 14 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 15 <TextBox Height="74" HorizontalAlignment="Left" Margin="26,41,0,0" Name="txtText" Text="" VerticalAlignment="Top" Width="398" /> 16 <Button Content="Siguiente Página" Height="82" HorizontalAlignment="Left" Margin="88,143,0,0" Name="btnNext" VerticalAlignment="Top" Width="259" /> 17 </Grid> 18 </Grid> 19

Segunda Página

 

1 <Grid x:Name="LayoutRoot" Background="Transparent"> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="Auto"/> 4 <RowDefinition Height="*"/> 5 </Grid.RowDefinitions> 6 7 <!--TitlePanel contains the name of the application and page title--> 8 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 9 <TextBlock x:Name="ApplicationTitle" Text="Navegación" Style="{StaticResource PhoneTextNormalStyle}"/> 10 <TextBlock x:Name="PageTitle" Text="Pagina 2" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 11 </StackPanel> 12 13 <!--ContentPanel - place additional content here--> 14 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 15 <TextBlock Height="49" HorizontalAlignment="Left" Margin="46,38,0,0" Name="txtData" Text="Sin Datos.." VerticalAlignment="Top" Width="370" /> 16 <Button Content="Página Anterior" Height="93" HorizontalAlignment="Left" Margin="113,128,0,0" Name="btnBack" VerticalAlignment="Top" Width="216" /> 17 </Grid> 18 </Grid> 19

En la primera página en el evento click del botón utilizaremos el método:

Navigate:  Solo hay que pasarle como argumento los siguientes parámetros:

  • Objeto URI, con la dirección de la página deseada. Recordemos que los objetos de tipo página se referencian con la URI (Unique Resource Identifier), del cual, por ejemplo, la URL es sólo un subtipo de URI. 
  • Tipo de referencia URI, puede ser relativa, absoluta, o desconocida. En este caso, como regla nemotécnica, nos puede ayudar el pensar que esto está “relativizado” a la aplicación y no a un sitio web. Si la dirección de la página empieza con una barra, tendrá como referencia no el root del filesystem, sino la raíz de la aplicación, y será una dirección relativa.

 

1 void btnNext_Click(object sender, RoutedEventArgs e) 2 { 3 NavigationService.Navigate(new Uri("/page2.xaml", UriKind.Relative)); 4 } 5

En la segunda página para volver a la anterior utilizaremos el método GoBack(), donde es la propia aplicación la que determina la secuencia de navegación a través de su registro de historial.

1 void btnBack_Click(object sender, RoutedEventArgs e) 2 { 3 NavigationService.GoBack(); 4 } 5

 

Si ejecutamos ahora la aplicación veremos como funciona correctamente la navegación, pero como pasamos datos de una página a otra?, bien sencillo a través de unos de estos métodos

  • Pasar los parámetros como cadenas de consulta (querystring) en la dirección de la página receptora. Esto es estándar HTTP.
  • Pasar parámetros al constructor de la nueva página. Para ello, debemos alterar la definición de la página receptora de los parámetros, modificando su constructor para que acepte parámetros.

1 – QueryString

Este método es bien sencillo es el estándar HTTP.

1 void btnNext_Click(object sender, RoutedEventArgs e) 2 { 3 string url = "/page2.xaml?text=" + txtText.Text; 4 NavigationService.Navigate(new Uri(url, UriKind.Relative)); 5 }

 

Para recoger el texto en la pagina 2 utilizaremos el método QueryString

 

1 public Page2() 2 { 3 InitializeComponent(); 4 Loaded += new RoutedEventHandler(Page2_Loaded); 5 btnBack.Click += new RoutedEventHandler(btnBack_Click); 6 } 7 8 void Page2_Loaded(object sender, RoutedEventArgs e) 9 { 10 string text = NavigationContext.QueryString["text"]; 11 txtData.Text = text; 12 } 13 14 void btnBack_Click(object sender, RoutedEventArgs e) 15 { 16 NavigationService.GoBack(); 17 }

Para recoger los parámetros pasados por querystring utilizaremos la clase NavigationContext

2-Constructor

Vamos a crear una clase mus sencilla con una propiedad

 

1 public class ParameterData 2 { 3 public string ParameterText { get; set; } 4 } 5

En la pagina a recibir modificamos el constructor para que tenga como parámetro una instancia de la clase anterior

1 public Page2(ParameterData data) 2 { 3 InitializeComponent(); 4 if (data != null) 5 txtData.Text = data.ParameterText; 6 btnBack.Click += new RoutedEventHandler(btnBack_Click); 7 }

 

Lo que tendremos que utilizar en este caso es el objeto RootVisual que es la  página XAML actual.

1 void btnNext_Click(object sender, RoutedEventArgs e) 2 { 3 ParameterData data = new ParameterData(); 4 data.ParameterText = txtText.Text; 5 App.Current.RootVisual = new Page2(data); 6 } 7

Lo que no nos funcionara en este caso es el método GoBack para regresar a la anterior, deberemos utilizar el método anterior, esto ocurre porque el Journaling (historial de navegación) no registrará la navegación. Para evitar excepciones en el método GoBack  deberíamos utilizar la propiedad canGoBack de la clase NavigationService

Os dejo el código

 

Download File – Navigation