Los contractos es una de las novedades más importantes de Windows 8. Esta funcionalidad propone una serie de interfaces estándar que permitirán a las aplicaciones interactuar entre sí sin necesidad de conocerse, simplemente cumpliendo los requisitos que el contrato define. También existirán contratos que no servirán para interactuar con otra aplicación sino directamente con el sistema operativo.
Windows 8 será el encargado de orquestar las comunicaciones mediante contratos, ya sean entre aplicaciones o del propio SO con una aplicación concreta. Por ejemplo, en un contrato de Share entre dos aplicaciones (origen y destino), el sistema se sitúa en medio para solicitar la información a la aplicación origen y, una vez obtenida, mostrar las aplicaciones que hayan implementado el contrato de destino de compartición, para que el usuario elija entre ellas. Finalmente enviará la información compartida en origen al destino. El siguiente gráfico muestra el proceso de forma detallada.
Existen una gran variedad de contratos que cubren distintos aspectos del sistema, pero podemos destacar los siguientes:
-
launch: indica que el usuario lanzó la aplicación o pulsó en su tile
-
search: indica que el usuario ha solicita buscar dentro de la información de la aplicación
-
shareTarget: indica que el usuario quiere compartir con la aplicación información proveniente de otra.
-
file: una aplicación ejecutó un fichero que la aplicación que implementa el contrato es capaz de manejar
-
protocol: una aplicación ejecutó una URL cuyo protocolo la aplicación que implementa el contrato es capaz de manejar
Los contratos cumplen una función muy importante dentro del sistema puesto que permiten que aplicaciones sencillas implementen escenarios complejos mediante colaboraciones orquestadas a través de contratos.
De este modo se podrá cumplir el principio de diseño Metro que sostiene que las aplicaciones deben ser excelentes en un aspecto en lugar de buenas en varios, sin que el sistema pierda funcionalidad en su totalidad, puesto que todas estas aplicaciones sencillas pero excelentes colaborarán para soportar los más complejos escenarios.
Por último, algunos de los Charms de la barra lateral deslizante derecha de Windows 8 se conectarán con la aplicación mediante estos contratos. Es el caso de Search, Share y Settings. Cuando un usuario pulse en estos botones al estar abierta una aplicación, Windows ejecutará la implementación que la aplicación haya dado para esos contratos.
De este modo podremos desplazar esta funcionalidad común a la gran mayoría de aplicaciones fuera de la interfaz gráfica de la misma, ofreciendo además un mecanismo unificado a todo el sistema operativo que reduce la curva de aprendizaje para el usuario.
Implementar el contrato de Search
Vamos a implementar el contrato más popular de todos: el de búsqueda. El primer paso sería crear, a través de Solution Explorer, una nueva carpeta llamada search dentro de la carpeta pages. Posteriormente seleccionaremos esta nueva carpeta, pulsaremos el botón derecho del ratón y elegiremos la opción de menú Add -> New Item para añadir un nuevo elemento dentro. En la ventana que aparecerá seleccionaremos el ítem Search Target Contract y le daremos la palabra search como nombre.
Al aceptar Visual Studio creará tres ficheros por nosotros: uno para la página HTML que va a mostrar los resultados, otro para su estilo CSS y un tercero para recoger lógica en JavaScript. Si abrimos el fichero JavaScript, en la cabecera del mismo se nos indicará que tenemos que añadirlo a la página de inicio de la aplicación, default.html por defecto.
Una vez hecho esto, tenemos que tener en cuenta que la implementación que crea por defecto Visual Studio se basa en la información de pruebas que se generaba en el fichero data.js. Por ello son necesarias algunas pequeñas modificaciones, empezando por el fichero de lógica en JavaScript search.js.
En el método generateFilters vamos a definir los filtros de agrupación para los resultados que recupera el mecanismo de búsqueda. Esto sería útil si, por ejemplo, tuviéramos varios sitios web distintos con noticias. Sin embargo, al no ser el caso, podemos eliminar los dos que filtran por grupos y mantener sólo el que muestra todos los elementos bajo la etiqueta All. El método, por tanto, quedaría así.
El siguiente método en el que tenemos que fijarnos es itemInvoked, que se ejecutará cuando el usuario pulse en alguno de los resultados mostrados. En este caso hace falta completarlo indicando a qué página vamos a navegar y recuperando el ítem concreto cuyos detalles queremos visualizar. El código quedaría así:
El último de los métodos que tenemos que modificar es searchData, que va a ser en la práctica el método que buscará coincidencias en la información para el criterio de búsqueda utilizado. En este caso el código quedaría así:
Si nos fijamos bien, la única diferencia es que vamos a cambiar ligeramente sobre qué propiedades del modelo de información subyacente se realiza la búsqueda, además de eliminar la comprobación de existencia del espacio de nombres Data. El método va a aplicar una expresión regular basada en el criterio de búsqueda contra las propiedades title, subtitle o content.
Por último, tendríamos que hacer un último cambio en el método markText, que se encarga de modificar ligeramente los valores de las propiedades por las que estamos buscando antes de bindearlas con la pantalla de resultados, para resaltar los términos encontrados. El código quedaría así:
Es necesario añadir el método toStaticHTML puesto que la modificación para resaltar contenido puede llevar a error al mecanismo de seguridad interno de las Aplicaciones Metro, creyendo que existe código dinámico y lanzando una excepción. De este modo nos aseguraremos que, sea cual sea la transformación resultante de añadir las etiquetas mark, siempre va a poder visualizarse correctamente.
El resto de métodos del fichero van a ser comunes a prácticamente cualquier implementación que hagamos del contrato en otras aplicaciones, salvo que decidamos cambiar el mecanismo de visualización de los resultados.
En cuanto a la vista, tendremos que hacer un pequeño cambio en search.html. En concreto, en la template que va a formatear cada elemento del grid que desplegará los resultados. Dicho fragmento de HTML quedaría como se puede ver a continuación.
La única diferencia apreciable se encuentra en la segunda de las etiquetas , que va a bindearse a la propiedad content en lugar de hacerlo a description.
Para probar estos cambios no tenemos más que realizar una búsqueda contra la aplicación, ya sea desde Start o abriéndola.
Un último apunte interesante: al añadir un nuevo contrato, estaremos incorporando una capacidad extra a la aplicación que, en este caso, el sistema operativo necesita conocer par poder registrar la aplicación en la lista que muestra al realizar una búsqueda desde el Charm de Search. Esto se realiza a través del manifiesto de la aplicación (fichero package.appxmanifest) que, si abrimos con Visual Studio, veremos que ha añadido una entrada para el nuevo contrato bajo la pestaña Declarations.
En Genbeta Dev | Programar aplicaciones Metro en Windows 8
Es especialista en metodologías ágiles y en estándares web relacionado con HTML5. Es miembro activo de la comunidad .NET a través de MADNUG y colabora con medios como DotNetMania, PC Actual o Desarrolloweb.com.
Puedes seguirle en Twitter: @javierholguera o en su blog: javierholguera.com