Conversión de Windows Phone para Windows 8

Estándar

Migración de una aplicación para compartir fotos de Windows Phone para ejecutarse en Windows 8.

La aplicación que vamos a trabajar es una sencilla aplicación de Flickr espectador. En el arranque se recupera un feed XML de fotos recientes con la etiqueta “wp7”. El feed XML se convierte en una colección de objetos que se muestran en un control ListBox.

El trabajo pesado se hace todo en nuestra clase MainPageViewModel, sino que expone una colección, FlickrImages, al que el ListBox está enlazado a datos. Listado 1 muestra que estamos utilizando la clase WebClient para descargar el feed XML como una cadena. Esto es luego analizado en un XElement, lo que nos permite ejecutar posteriormente una expresión LINQ para extraer una serie de objetos FlickrImage. Éstas posteriormente se agregan a la colección FlickrImages.

Con el fin de mostrar los objetos FlickrImage, un ListBox se añade a la MainPage con una adecuada ItemTemplate, como se puede ver en el Listado 2 . Puntos a tener en cuenta aquí es que una instancia de la MainPageViewModel se crea como un recurso en la página con la tecla “ViewModel”, los “recursos” ViewModel se establece como el DataContext de la página. La propiedad ItemsSource del ListBox enlazado a datos es entonces a la propiedad FlickrImages en el DataContext actual (que, por supuesto, que hereda de la página, y es la instancia de la clase MainPageViewModel).

Con el fin de mostrar los objetos FlickrImage, un ListBox se añade a la MainPage con una adecuada ItemTemplate, como se puede ver en el Listado 2 . Puntos a tener en cuenta aquí es que una instancia de la MainPageViewModel se crea como un recurso en la página con la tecla “ViewModel”, los “recursos” ViewModel se establece como el DataContext de la página. La propiedad ItemsSource del ListBox enlazado a datos es entonces a la propiedad FlickrImages en el DataContext actual (que, por supuesto, que hereda de la página, y es la instancia de la clase MainPageViewModel).

Lo único que queda por hacer es llamar al método Load en el MainPageViewModel, que se realiza en el método OnNavigatedTo en el MainPage.

public partial class MainPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        (DataContext as MainPageViewModel).Load();
    }
}

Ejecutar este ejemplo producirá una aplicación básica que muestra una lista de fotos y sus correspondientes títulos de Flickr, como se muestra en la figura 1 .

La siguiente parte es para nosotros para convertir esto en una aplicación Windows 8. El primer paso es copiar nuestra aplicación a través de nuestro Windows 8 máquina. Alternativamente, usted puede instalar el Windows Phone 7.1.1 Update en Windows 8 máquina de modo que usted no tiene que cambiar constantemente de ida y vuelta.

Si intenta abrir la aplicación Windows Phone en Visual Studio 11 (necesario para el desarrollo de aplicaciones Metro en Windows 8), usted encontrará que la solución se abre correctamente, pero el proyecto de Windows Phone no se carga. Esto es porque no hay una versión del SDK Windows Phone que trabaja en VS11.

La realidad es que incluso si pudiéramos abrir el proyecto, todavía había necesidad de crear un nuevo proyecto del Metro de Windows 8, ya que existen incompatibilidades sustanciales en el modelo de página XAML y que significan que casi ninguno de la interfaz de usuario es reutilizable. Pensando en esto, es probable que no desea volver a utilizar un diseño de 480×800 para tu pizarra / aplicación de escritorio de todos modos.

Por lo tanto, el siguiente paso es agregar un nuevo proyecto a la solución: Agregar nuevo proyecto / Visual C # / Windows estilo Metro / Aplicación en blanco. Vamos a llamar a los MetroFlickrImages proyecto.

Todavía queremos volver a utilizar tanto código como sea posible, así que vamos a añadir una referencia a la clase MainPageViewModel en el nuevo proyecto. Haga clic derecho en el proyecto y seleccione Agregar / Elemento existente / localizar MainPageViewModel.cs / Agregar enlace (en el menú desplegable junto al botón Agregar). Tan pronto como usted hace esto te darás cuenta de errores de compilación de la aplicación, como resultado de las diferencias entre el Windows Phone y Windows 8 (WinRT) modelo de programación.

La fijación de este requiere la sustitución del uso de WebClient (no se admite en WinRT) con el uso de HttpWebRequest. Al hacer esto, también vamos a hacer un cambio de utilizar el modelo asincrónico nueva programación. Esto va a limpiar el código, sin obstaculizar la interfaz de usuario de la aplicación. El código resultante se muestra en el Listado 3 .

Tenga en cuenta que en lugar de llamar BeginGetResponse en el objeto de la petición, típico de una aplicación de Windows Phone, que llamamos GetResponseAsync. Esta llamada al método tiene como prefijo la palabra clave espera y el método de carga tiene como prefijo la palabra clave asíncrona.Esta combinación significa que el método de carga se puede invocar desde el hilo de interfaz de usuario y se ejecutará de una manera aparentemente secuencial, pero sin bloquear el subproceso de interfaz de usuario mientras realiza la llamada red.

Mientras que el método GetResponseAsync inicia la llamada red para descargar el feed XML, el hilo de interfaz de usuario continúa ejecutándose. Cuando se devuelve la llamada al método, el método de carga continúa para ejecutar, de nuevo en el subproceso de interfaz de usuario, para permitir que el XML para ser procesados ​​de una manera secuencial. Este significativamente recoge así el código y hace que sea mucho más fácil seguir el hilo de ejecución, en lugar de tener que saltar entre llamadas a métodos y controladores de eventos o devoluciones de llamada.

El XAML en el Listado 4 se utiliza para crear una instancia de la clase MainPageViewModel, conéctelo como el DataContext de la página y luego conecte la propiedad FlickrImages a la propiedad ItemsSource en un ListBox.

Observe una ligera diferencia en la forma en que los recursos son cableados, tanto para el DataContext y la ItemTemplate de ListBox. En lugar de hacer referencia a los recursos mediante el elemento StaticResource (según el XAML para la aplicación Windows Phone), la aplicación Metro utiliza un elemento de enlace con el atributo Source establecida en el StaticResource. Esto se debe a que actualmente no hay soporte para el marcado StaticResourceExtension (a pesar de Mezcla de intentar usarlo).

La ejecución de este código se crea la aplicación Windows 8 se observa en la figura 2 , se ejecuta en el simulador VS11.

La pregunta ahora es si hemos roto nada en nuestra aplicación Windows Phone con los cambios que hicimos a MainPageViewModel.cs. Si usted no tiene el Visual Studio Async CTP instalado, usted encontrará que su aplicación de Windows Phone ya no compila.

Después de instalar la CTP, tendrá que añadir una referencia a la AsyncCtpLibrary.dll. Es necesario utilizar la versión telefónica de esta dll., Que se instala en% usuario% \ Documents \ Microsoft Visual Studio Async CTP \ Samples \ AsyncCtpLibrary_Phone.dll.

Con la CTP Async instalado y se hace referencia, la aplicación Windows Phone debería volver a construir. Sin embargo, ejecutar la aplicación dará lugar a una NotSupportedException cuando se intenta cargar el XML a partir de la secuencia de respuesta. Para solucionar este problema, basta con establecer la propiedad AllowReadStreamBuffering en el objeto HttpWebRequest en true.

var request = HttpWebRequest.CreateHttp("http://api.flickr.com/services/feeds/photos_public.gne?format=xml&tags=wp7");
#if WINDOWS_PHONE
    request.AllowReadStreamBuffering = true;
#endif
var resp = await request.GetResponseAsync();

Aquí hemos hecho la declaración condicional, por lo que sólo está establecida para la aplicación Windows Phone. Ahora tienes el Windows 8 y Windows Phone que comparten la misma lógica de la base, pero tienen su propia estructura de proyectos y diseños de página.

En este post he visto cómo adaptar un proyecto simple para permitir reutilizar una parte de su solicitud a través de ambos un Windows 8 y un proyecto de Windows Phone. A medida que Microsoft se acerca a una versión de Windows y busca actualizar la plataforma Windows Phone, esperamos encontrar un mejor soporte para la reutilización de código entre los proyectos, pero por ahora tenemos que poner en el trabajo extra para prepararse para el futuro.

Codigo Ejemplo : Descargar

Articulo Original : http://visualstudiomagazine.com

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