Archive

Archive for the ‘General’ Category

Cambiando la apariencia de un DataGrid automáticamente en un lapso de tiempo

March 16th, 2012 No comments

El día de hoy hicieron una pregunta muy interesante en el grupo de La Liga Silverlight en Facebook.  Aquí la pongo textual:

“AYUDA!!!
Tengo un DataGrid en Silverlight con los siguientes campos {idhorario, horainicio, horafin, dia, idseccion}.
necesito que los campos {horainicio y horafin}, cambien de color en una Hora indicada, me explico, tengo una materia de 12:00 a 2:00pm, y son las 1:00pm en mi reloj, que estos campos aparezcan en otro COLOR… o que llamen la atencion de alguna manera.
COMO HAGO ESTO???”

Se me ocurren unas 3 o 4 maneras para resolver esto, pero decidí irme por la que creo yo la más eficiente: usar la característica de enlace en los setters de los estilos, disponible a partir de Silverlight 5.

¡Manos a la obra!

El Proyecto

Iniciaremos creando un proyecto regular de Silverlight 5 llamado Horarios usando la plantilla de Silverlight Application.

Clase Materia

La primera tarea será modelar la clase para cada materia.  A esta clase la llamaremos Materia.  A continuación podrán observar la implementación completa:

 

Puedes leer el artículo completo en esta dirección

Categories: General Tags: ,

Tres años de La Liga Silverlight

December 21st, 2011 No comments

birthdayLa Liga Silverlight: La Primera Comunidad en Español acerca de Silverlight y tecnologías relacionadas ha cumplido ya su tercer año de vida.  Esto fue desde el mes pasado y este post había estado en los pendientes desde entonces.

Queremos agradecer a todos y cada uno de las personas involucradas con la comunidad y el sitio en Facebook.  Todas y cada una de sus colaboraciones han sido parte importante de la comunidad en donde todos hemos podido aprender más y más acerca de Silverlight y demás temas como XAML, Silverlight para Windows Phone 7 y 7.1, WCF RIA Services y un largo etcétera.

Algunos datos acerca de La Liga Silverlight

  • La Liga Silverlight es la Primera y única comunidad en español acerca de Silverlight
  • En este año se incrementaron las visitas en un 45% !
  • Los países que más visitan la comunidad son México, España, Colombia, Ecuador, Argentina, Perú, Chile, Costa Rica, Venezuela, Bolivia, Estados Unidos, Uruguay y El Salvador

¿Qué viene para La Liga Silverlight?

LigaSilverlightLes puedo comentar que durante 2012 vienen una gran cantidad de noticias y recursos nuevos acerca de Silverlight y sus tecnologías relacionadas.  En estos momentos no puedo darles más detalles pero ya muy pronto sabrán de qué estamos hablando Smile

¿Puedo participar?

¡Claro! Todo mundo puede compartir sus artículos acerca de la tecnología dentro de la comunidad.  Para mayor información escríbenos a contacto@LigaSilverlight.com o visita el sitio de Facebook.

Categories: General Tags: ,

Anunciando: La Entrevista MVP

October 22nd, 2011 No comments

A partir de lo anunciado en el evento Build el 13 de Septiembre 2011 con respecto a Windows 8 y su Plataforma de Desarrollo, conocer Silverlight es ahora más importante y relevante que nunca.

En La Liga Silverlight – La Primera Comunidad MSDN en Español acerca de Silverlight y tecnologías relacionadas, nos hemos dado a la tarea de entrevistar a diversas personalidades y líderes de opinión en el ámbito tecnológico de Silverlight quienes nos estarán dando a conocer sus puntos de vista con respecto a este y demás temas.

Les presento: La Entrevista MVP

La Entrevista MVP

micsLa Entrevista MVP es una entrevista (inicialmente por escrito, probablemente hagamos alguna entrevista audiovisual a mediano plazo), con periodicidad mensual, en donde podrán obtener de primera mano los puntos de vista, opiniones y comentarios de varios Profesionales Más Valiosos (MVP) de Microsoft, principalmente de Silverlight.

Hoy en día, es sumamente fácil toparnos con pseudo-periodismo digital, ignorante, mal informado y tendencioso, que lo único que hacen es confundir más a las personas que –erróneamente- los leen o escuchan, por lo que es excelente idea el tener a nuestro alcance las opiniones directas de profesionales que saben verdaderamente de lo que están hablando y que cuentan con información y argumentos privilegiados para opinar, contundentemente, acerca de la tecnología en la que son Expertos.

Las entrevistas estarán disponibles mensualmente (y si es posible, más frecuentemente) en el sitio de La Liga Silverlight y estarán completamente traducidas a nuestro bello idioma.

¿Les gusta la idea?  ¡No se pierdan esta serie, que estará bastante interesante!

Salu2!!!

Silverlight 5 RC disponible ahora

September 1st, 2011 No comments

sl5logo

El día de hoy ha sido liberado Silverlight 5 RC (Release Candidate) el cual marca un paso más en esta versión, con mejoras en rendimiento y adiciones de funcionalidad súper importantes.

Silverlight 5 RC incluye una gran cantidad de componentes y funcionalidades adicionales, entre las que podemos destacar:

  • Plantillas de Datos implícitas
  • p/Invoke (RC)
  • Confianza Elevada en aplicaciones dentro del navegador
  • Soporte para múltiples ventanas del Sistema Operativo
  • Acceso al Sistema de Archivos completo en Confianza Elevada
  • Soporte para breakpoints en expresiones {Binding} en XAML
  • Soporte para 64 bit (RC)
  • Soporte para impresión vectorial (RC)
  • …y más!

Lo pueden obtener desde la página de descargas del Sitio Oficial de Silverlight

Nota: Esta liberación *todavía* no tiene licencia de tipo “Go Live”, hasta la versión final.  Pero si quieren construir aplicaciones con Silverlight, o migrar aplicaciones de Silverlight 2/3/4 hacia 5… este es el momento adecuado para hacerlo.

 

Salu2!

Categories: General Tags:

Utilizando un escáner desde una aplicación Silverlight

August 3rd, 2011 No comments

432532_sri_scanner

Como he mencionado anteriormente aquí y aquí, las aplicaciones de Silverlight pueden ser clientes de automatización, es decir, pueden invocar los servidores de automatización registrados en el sistema operativo Windows de la máquina del usuario.

Un requerimiento bastante común en aplicaciones de negocio es poder utilizar el escáner conectado desde nuestro aplicativo, para poder digitalizar una imagen y posteriormente serializarla a disco y/o presentarla en pantalla, etc.

En sistema operativo Windows contamos con WIA (Windows Image Acquisition), la cual es una plataforma que permite a nuestras aplicaciones interactuar con hardware de imágenes y también estandariza la interacción entre las aplicaciones y los escáneres, es decir, es un común denominador entre el manufacturero del dispositivo y tú como desarrollador.  WIA está presente en Windows desde Windows ME en adelante, y su versión más reciente es la 2.0.

Es importante notar que tu hardware debe ser compatible con WIA para que el código de ejemplo de este artículo funcione.  Revisa la documentación de tu escáner para conocer si existe compatibilidad.

WIA.CommonDialog

El objeto WIA.CommonDialog tiene diferentes métodos que nos ayudan a desplegar las cajas de diálogo para poder seleccionar un dispositivo de imagen, como una cámara o un escáner, y además para escanear una imagen.  Si creamos una referencia a este objeto por medio de la clase AutomationFactory, podemos fácilmente integrar capacidades de escaneo en nuestra aplicación de Silverlight.

El objeto WIA.CommonDialog tiene algunos métodos bastantes interesantes, los cuales se destacan en la siguiente tabla:

ShowSelectDevice Muestra una caja de diálogo para seleccionar el dispositivo que deseamos utilizar, por ejemplo una cámara o un escáner.
ShowDeviceProperties Muestra las propiedades del dispositivo seleccionado en el método ShowSelectDevice
ShowAcquireImage Abre una caja de diálogo para escanear una imagen, usando el dispositivo configurado por default

Puedes leer el artículo completo aquí

Accediendo a tus ensamblados de .NET desde Silverlight–Parte 2

July 27th, 2011 No comments

En el artículo anterior, vimos el uso de la clase AutomationFactory para poder crear objetos de tus ensamblados creados con el .NET Framework 4.0, y utilizarlos en Silverlight.

En el ejemplo, invocamos un método como cualquier otro y efectivamente obtenemos los resultados esperados, en este caso, la lista de unidades lógicas del equipo del usuario en donde está ejecutando la aplicación.  Pero ¿qué pasaría si necesitáramos manejar un evento que es disparado por el componente (tu ensamblado) de .NET?  En este caso la implementación debe cumplir con ciertos requisitos.

Atributo ComSourceInterfacesAttribute

Para que podamos exponer un evento en nuestro ensamblado, y que pueda ser manejado por la aplicación de Silverlight a través de automatización, debemos marcar nuestra clase que implementa el evento con el atributo ComSourceInterfacesAttribute, el cual indica una lista de interfaces que contienen los eventos a exponer en dicha clase.

Puedes leer el artículo completo aquí

Accediendo a tus ensamblados de .NET desde Silverlight

July 27th, 2011 No comments

El BCL (Biblioteca de Clases Base, por sus siglas en inglés) de Silverlight está reducido a comparación del BCL del .NET Framework completo que tenemos instalado en nuestros equipos, por lo que la funcionalidad no es la misma en un aplicativo de Silverlight que alguno construido con el .NET Framework completo.

No obstante, a partir de Silverlight 4, es posible que las aplicaciones de Silverlight sean clientes de automatización cuando ejecutan en Confianza Elevada, esto es, poder invocar los servidores de automatización registrados en el sistema operativo Windows.  Generalmente, la mayoría de ejemplos que podemos encontrar en la Web al respecto de esta característica van por el lado de invocar los servidores de automatización de Office (Outlook.Application o Excel.Application por ejemplo), pero ¿qué sucede si necesitamos invocar funcionalidad ya construida en alguno de nustros ensamblados que hayamos escrito en .NET 4.0?

Ensamblado

En esta solución crearemos dos proyectos, uno de tipo Class Library del .NET Framework 4.0 y otro proyecto será la aplicación de Silverlight.

En el proyecto de la Biblioteca de Clases escribiremos la funcionalidad para obtener la información de todas las unidades lógicas del equipo.  Tradicionalmente, esto lo podemos lograr por medio de la clase DriveInfo del espacio de nombres System.IO, pero justamente esa es una de las clases que no está en el BCL de Silverlight, por lo que crearemos un ensamblado de .NET 4.0 que regrese esa información, y la usaremos en un aplicativo de Silverlight.

La clave para lograr esto es abrir las propiedades del proyecto de la Biblioteca de Clases y seleccionar la opción “Register for COM interop” para poder exponer este ensamblado a través de COM.

Puedes leer el artículo completo aquí

Una mejor experiencia de instalación y actualización para Silverlight 4.0

March 21st, 2011 No comments

Por más pulida que sea la aplicación, puede que el usuario nunca llegue a verla gracias a una mala experiencia antes de siquiera ver nuestra primera pantalla. Hay diversas razones para esto; por ejemplo, puede que Silverlight no esté instalado, o que la versión presente sea incorrecta. Contrario a lo que muchos piensan, el desarrollador tiene casi completo control sobre lo que sucede en estos casos y cómo es presentado. En este artículo Andrew Tokeley nos da una guía práctica para mejorar la experiencia del usuario al instalar o actualizar nuestra aplicación.

 

Este artículo fue publicado originalmente en Maromas Digitales y es una traducción aproximada del artículo Better Silverlight 4.0 Installation and Upgrade Experience publicado en inglés por Andrew Tokeley el 17 de octubre del 2010.

 

Las apariencias son muy importantes. De hecho, la forma en que una aplicación es instalada, o actualizada, y cuánto dura en arrancar puede tener una gran influencia en el concepto que el usuario tenga de ella. Tal como viene de fábrica, Silverlight no ayuda mucho, pero tranquilos que con un poquito de esfuerzo de puede superar ese obstáculo.

La siguiente figura ilustra la serie de pruebas necesarias cuando un usuario navega a la página que contiene la aplicación de Silverlight (para una imagen más amplia le sugiero abrir la imagen en una pestaña nueva).

 

Secuencia de inicio de una aplicación de Silverlight.

 

Verificando que Silverlight está instalado

El archivo Silverlight.js se encarga de todo esto antes de que la aplicación siquiera sea cargada, pero aun así nosotros podemos agregar un poco de magia.

Una de las primeras cosas que hay que verificar es si Silverlight está instalado en el cliente y si es la versión correcta. Hay un excelente documento que explica el proceso en todo detalle. Sin embargo creo que se puede simplificar un poco y por eso he escrito este artículo.

En el archivo estándar que Visual Studio prepara, agreguen el siguiente código en la función onSilverlightError—de otro modo no será posible determinar si se requiere actualizar la versión ya instalada de Silverlight. (Puede que esto sea una pulga, aunque todavía no lo he investigado.)

 

 

Luego hay que añadir el siguiente código en JavaScript. Estas funciones nos permiten controlar el HTML que es desplegado dependiendo de si Silverlight está instalado y cuál es su versión.

 

 

Al cargar la página podemos entonces llamar la función checkSupported() para que le avise al usuario si el navegador no es del todo compatible. Lo importante es no dejar de intentar la instalación incluso si no está en la lista oficial de navegadores compatibles de Microsoft. Es posible que todavía se pueda ejecutar.

 

 

Finalmente, podemos alterar el elemento object para que incluya ciertos parámetros adicionales (y algunos divs extra en mi ejemplo). Presten especial atención a onUpgradeRequired, onInstalledRequired y onRestartRequired. Estos apuntan a funciones que serán llamadas por Silverlight.js durante las diferentes etapas.

 

 

Para probar, se puede cambiar el minRuntimeVersion a un número mayor del que está actualmente instalado causando el siguiente resultado.

 

onUpgradeRequired informa al usuario que necesita una versión más reciente de Silverlight.

 

Noten que he incluido PluginDetect en mi página, para poder identificar la versión instalada de Silverlight. Hay veces en que puede ser más fácil poder informar al usuario cuál versión es la que tienen y cuál es la que ocupan. Por supuesto, podemos decidir cuántos detalles mostrar mediante modificar Silverlight.onUpgradeRequired. El enlace para instalar la versión deseada es creado mediante llamar la función Silverlight.buildPromptHTML(versión) (definida en Silverlight.js).

El siguiente experimento es desactivar el plugin de Silverlight en el navegador. De esta manera se puede simular el caso de un usuario sin Silverlight en su máquina. De acuerdo con el código en Silverlight.onInstallRequired, debería verse algo como esto en la pantalla:

 

onInstallRequired notifica al usuarion que Silverlight no está instalado y le indica dónde conseguirlo.

 

Otra prueba es usar un navegador que no esté en la lista de los compatibles. Volviendo la versión a la que teníamos originalmente especificada, abrimos a página en el navegador de prueba y esta vez la aplicación es cargada pero con una nota de advertencia.

 

checkSupported advierte al usuario si el navegador no es compatible dejándolo decidir si desea ejecutar la aplicación.

 

También es fácil comprobar si la aplicación ha sido instalada en la computadora. Todo lo que hay que hacer es verificar la condición App.Current.InstallState == InstallState.Installed y si es cierta entonces desplegar algo como lo siguiente.

 

La aplicación en sí puede detectar si ya ha sido instalada fuera del navegador.

 

Actualizando una aplicación OOB

Si la aplicación tiene como propósito que sea eventualmente instalada en el computador y usada en fuera del navegador (OOB por sus siglas en inglés), entonces es importante asegurarse de que revise si hay actualizaciones disponibles en el servidor. Recuerden que una vez que el usuario instala la aplicación, dejará de ser actualizada automáticamente, aun habiendo nuevas versiones del XAP en el servidor.

En mi ejemplo he creado una página con el propósito específico de revisar si hay actualizaciones. La página es cargada siempre al inicio de la aplicación y le avisa al usuario si hay una actualización disponible, si no entonces pasa el mando a la página principal.

De esta manera podemos informar al usuario que la aplicación está buscando actualizaciones y presentar una animación mientras tanto.

 

La aplicación revisando si hay versiones más recientes en el servidor.

 

El único código interesante de esta página es:

 

 

Es no más asunto de conectar un controlador que sea ejecutado cuando complete CheckAndDownloadUpdatesAsync() y que informe al usuario si hay una nueva versión disponible. Algo como esto:

 

En caso de haber sido actualizada, la aplicación informa al usuario al respecto.

 

Pantalla de cargado personalizada

Finalmente, una forma efectiva de darle un aspecto profesional es evitar que esta animación aparezca:

 

Esferas originales (y ya aburridas) de Silverlight cargando. La idea es usar algo original. 

 

El procedimiento es sencillo y ha sido bien explicado por Laurent Duveau y en MSDN por lo que no voy a repetirlo acá. Sin embargo, hay algunas cosas que a veces no quedan claras:

  • No estoy seguro por qué, pero la pantalla de cargado no siempre aparece. En todo caso, he notado lo siguiente:
    • Chrome parece ser el mejor portado.
    • Limpien el cache del navegador para asegurarse de que de hecho están descargando algo.
    • He obtenido resultados más consistentes haciendo clic derecho en la página HTML (o aspx) y seleccionando Ver en el explorador… en vez de usar F5 para depurar.
  • Si ven la animación original con las esferas azules el problema es generalmente un error ortográfico en alguno de los parámetros en el elemento object. Si ven una página en blanco si pantalla de cargado entonces probablemente la aplicación no ha sido descargada. Tal vez por estar en el cache; vean el paso anterior.
  • El XAML de la pantalla de cargado es un fragmento. No necesita estar dentro de un UserControl o Page. Por ejemplo, basta con declarar un elemento Canvas o Grid y crear el contenido (ejemplos más adelante).
  • Puesto que el XAML reside en la página de web, no es posible verla en el área de diseño de Blend. Lo que se puede hacer es diseñarla dentro de un proyecto de Silverlight y ya cuando está lista copiar el fragmento a la página de web.
  • No es posible usar código subyacente por lo que si tienen una animación, debe ser iniciada de una manera como esta:

     

 

Les muestro ahora un par de ejemplos de pantallas de cargado.

La forma más sencilla es rotar una imagen:

 

 

Otra es usar animaciones diferidas:

 

 

Pueden descargar el código de ejemplo acá. Mi recomendación es crear una aplicación de gran tamaño (decenas de MiB) que requiera una descarga lo suficientemente extensa como para ver la animación.

 

Andrew Tokeley

 

Nuevo engine de comentarios

March 19th, 2011 No comments

Acabamos de hacer una actualización en nuestro sistema de comentarios. A partir de ahora, estaremos usando Disqus, un engine de comentarios que está tomando popularidad en diferentes blogs y en sitios de la talla de Engadget, DotNetRocks, etc.

La migración de comentarios existentes parece haber sido un éxito.

Esperamos sea de tu agrado y cualquier duda o comentario no dudes en contactarme en twitter, correo o dejar un comentario Winking smile

Categories: General Tags:

DataGrid, ColumnSeries y un toque de MVVM

March 17th, 2011 12 comments

image

Recibí una pregunta pregunta en un post que había escrito previamente. La pregunta era como se puede cambiar una gráfica a la par con los datos de un DataGrid. La respuesta es ¡Con DataBinding!

Muchas gracias.

Ok ok, la explicación larga. Primero vamos a hacer un modelo para datos de prueba:

 

Este modelo cuenta con dos propiedades (Name y Value) e implementa INotifyPropertyChanged para poder manejar el Binding de forma correcta.

Ahora creamos el ViewModel. En una aplicación real deberías obtener dichos valores desde un webservice en tu servidor, pero para efectos prácticos, aquí inicializo una lista de objetos SampleData (nuestro modelo) en el constructor del ViewModel.

 

Finalmente creamos nuestra vista en XAML:

 

En la línea 13 creamos una instancia de nuestro ViewModel y la agregamos a nuestros recursos locales. Después, en la línea 17 asignamos dicho recurso al DataContext de nuestro LayoutRoot (en este caso el Grid que contiene todos los elementos de la vista). En la línea 30 definimos la propiedad Samples de nuestro ViewModel como la fuente de datos del DataGrid. En la línea 40 definimos el binding a la propiedad Value con un slider para modificar los datos fácilmente. Las líneas 55 y 57 se encargan de hacer lo mismo para la gráfica de barras.

Nótese como los bindings se definien con el Mode=TwoWay para actualizar el ViewModel “de ida y vuelta”, es decir, que los cambios en la vista se reflejan en el ViewModel y viceversa.

Puedes ver el ejemplo corriendo aquí. Y puedes descargar el código aquí.

UPDATE: De pura casualidad encontré mi compañera Araceli Medina encontró un bug en el Silverlight Toolkit mientras jugaba con el demo. Estaba jugando con mover sliders y cambiar el tamaño de la ventana cuando noté que esto pasaba:

image_thumb[2]

El borde inferior de los rectangulos no se quedaba en la parte de abajo de la gráfica. No estoy seguro a qué se deba esto pero si se vuelve a cambiar el tamaño de la ventana el problema se corrije. El bug fue dado de alta en codeplex.

[Artículo originalmente publicado en JAMolina.com]

Técnicas con MVVM

February 4th, 2011 No comments

Uno de los obstáculos que he notado en muchos (incluyéndome a mí) tratando de entender MVVM, es aceptar que no es una receta, sino un concepto. Estamos acostumbrados a buscar procedimientos reproducibles que nos lleven, paso a paso, a la solución. Desafortunadamente (o por dicha, según uno lo vea), MVVM no se presta a tal formato.

El patrón de diseño Modelo-Vista-Modelo de vista es más una estrategia, una idea general de cómo estructurar la solución a un problema. En vez de listas de pasos, necesariamente lo que encontramos son explicaciones de los componentes principales del patrón y algunos ejemplos de su aplicación. Para los que todavía no están familiarizados con el patrón, Jeremy Likness ha escrito una muy buena introducción al tema.

 

Estrategia y táctica

Si bien la estrategia a utilizar es esencial, las tácticas son las que ponen en acción el plan principal. En una batalla, la estrategia puede ser ocupar cierta zona para avanzar en el territorio enemigo, pero la forma en que las fuerzas son distribuidas o los diferentes ataques individuales forman las tácticas del enfrentamiento.

En MVVM, la estrategia es dividir la solución en ciertas zonas o capas como el modelo, la vista, y el pegamento entre ambas: el modelo de vista. Las tácticas incluyen, entre muchas otras, la navegación entre vistas, el envío de datos del modelo a la vista, la comunicación entre la vista y el modelo de vista, el uso de comandos y así por el estilo.

Aunque MVVM no se presta a recetas premeditadas, sí hay gran variedad de técnicas o tácticas que pueden ser usadas en su aplicación al problema y que pueden ser bien definidas en procedimientos concretos. Por ejemplo, en las últimas semanas he estado publicando traducciones de algunos artículos que proponen métodos para resolver el problema de la asociación entre vistas y modelos de vista y el manejo de transacciones en la interfase gráfica de la aplicación.

La ventaja del sistema completo, estrategia y técnica, es que podemos escoger las que mejor se adapten a nuestras circunstancias particulares o, siendo francos, a nuestro gusto. Los siguientes artículos muestran algunas formas de resolver problemas comunes enfrentados al implementar MVVM. Los invito a leerlos y escoger los que les parezcan apropiados, elegantes, efectivos, o cualquier otro aspecto que les llame la atención.

 

 

Categories: General Tags: ,

Hola Universo!

January 27th, 2011 6 comments

Mi nombre es Jimmy Sáenz Rizo, estudiante de Ingeniería en Sistemas, procedente de Nicaragua. Mi principal objetivo será ofrecerles guías en lo que respecta al apasionante mundo de Silverlight. Dichas guías se caracterizarán por ser “paso a paso” , con diferentes medios de explicación como imágenes, gráficos, videos, etc.. que faciliten el entendimiento de las publicaciones en lo posible. Como siempre he dicho, la solución de un algoritmo puede tener N soluciones así que espero aprender con ustedes en esta nueva etapa como miembro de La Liga Silverlight. Quisiera agradecer al equipo de la Liga Silverlight por esta oportunidad, especialmente a Rodrigo Díaz Concha por el apoyo.

En un principio las publicaciones serán “back to basic” para los nuevos aventureros, pero pronto realizaré entregas sobre temas como PivotViewer, Photosynth, mejoras en la experiencia de usuario y algunos mini-proyectos para avanzar en cuanto a conocimiento se refiere. Siéntanse en todo el derecho de preguntar cualquier duda que tengan, si conozco la respuesta con gusto se las daré y sino con gusto la buscaré Sonrisa 

Si desean contactarme pueden hacerlo a través de este medio.

Saludos!!

Categories: General Tags: