Drag and drop en WPF (I)

Un
req
uisito relativamente común en las aplicaciones actuales es la posibilidad de
realizar un drag and drop (arrastrar y soltar) entre
elementos. Nos permite representar fácilmente dos situaciones de la vida real,
como son el desplazamiento de objetos (en el caso de arrastrar un elemento y
soltarlo en su nueva posición) y el establecimiento de una relación entre
objetos (en el caso de arrastrar un elemento y soltarlo sobre el elemento al
que queremos enlazarlo).

Trabajando
en WPF tenemos disponible un método muy útil como es UIElement.CaptureMouse. Mediante este método podemos hacer que
cualquier UIElement se haga con el control exclusivo del ratón, y
cualquier evento generado por el ratón en otro elemento será ignorado. Esto nos
permite gestionar funcionalidad como el drag and
drop
sin interferir
en otros elementos de la interfaz. Veamos un ejemplo de cómo gestionar el
desplazamiento de un elemento sobre un canvas:

Primero
escribimos un manejador para el evento de MouseLeftButtonDown del elemento que
queremos arrastrar (en este caso una elipse):

        private void Ellipse_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        {

            Ellipse ellipse = sender as Ellipse;

 

            if (ellipse != null)

            {

                ellipse.CaptureMouse();

            }

        }

En este
manejador nos limitamos a capturar el ratón cuando el usuario hace click sobre
nuestra elipse. Posteriormente, escribimos un manejador para el evento MouseLeftButtonUp, que hará el proceso inverso, es decir, liberar el ratón:

        private void Ellipse_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)

        {

            Ellipse ellipse = sender as Ellipse;

 

            if (ellipse != null)

            {

                ellipse.ReleaseMouseCapture();

            }

        }

Ahora
la única tarea que nos queda es gestionar el movimiento de la elipse cuando
movamos el ratón. Dado que tenemos capturados los eventos del ratón, únicamente
tenemos que preocuparnos de mover la elipse cuando este se mueva, para lo que
aprovechamos el evento MouseMove:

        private void Ellipse_MouseMove(object sender, MouseEventArgs e)

        {

            Ellipse ellipse = sender as Ellipse;

 

            if (ellipse != null && ellipse.IsMouseCaptured)

            {

                Canvas.SetLeft(ellipse, e.GetPosition(MovementCanvas).X);

                Canvas.SetTop(ellipse, e.GetPosition(MovementCanvas).Y);

            }

        }

Con
este código tan sencillo hemos conseguido desplazar una elipse mediante una
operación de drag and drop.
Pese a que faltan multitud de comprobaciones para que el código sea optimo (la
elipse puede salirse de los bordes del canvas,
por ejemplo), sí que nos sirve para ilustrar nuestro primer ejemplo de drag
and drop.
En la segunda parte de este artículo, veremos cómo realizar un drag
and drop
que establezca una relación entre dos objetos.

Descarga el código completo

 

Dreamland / AJAX y la accesibilidad web. Tips & tricks

En el anterior post os comentaba los principales problemas que tiene AJAX a la hora de desarrollar aplicaciones accesibles. Ahora vamos a ver un par de pequeños consejos que, si bien no resuelven estos problemas en su totalidad, al menos disminuyen su impacto.

Deciamos que el primer problema era la dependencia que tienen las aplicaciones AJAX de JavaScript, y como este no se lleva bien con los lectores de pantalla. Pues bien, el primer consejo no podria ser mas simple: hacer que nuestras paginas sean capaces de funcionar con JavaScript deshabilitado. Tan simple (y tan complejo) como eso. Si somos capaces de ofrecer a nuestros usuarios la experiencia mejorada de AJAX solo si ellos la reclaman, cualquier persona podra elegir la manera que prefiera para acceder a nuestra aplicacion. Evidentemente, esto conlleva un trabajo extra para el desarrollador, y muchas veces se piensa que nadie estara interesado en ver una version «antigua» de nuestra web. pero…y si la version anterior es la unica que pueden utilizar?

Otro problema que teniamos era el hecho de que los lectores de pantalla no se dan por aludidos ante una actualizacion parcial de la pagina. De hecho, este problema no es exclusivo de los lectores de pantalla, sino que muchisimas personas no se dan cuenta de estos cambios al ser sumamente pequeños en ocasiones. Para esto, de nuevo, la mejor solucion es informar al usuario, Por una parte, deberiamos comunicarle que la informacion de la pagina se actualizara de forma dinamica, y tambien deberiamos darle la opcion de recibir una alerta (algo tan simple como un popup es mas que suficiente) cuando se produzca esta actualizacion. Y por otra parte esta la denominada «Yellow Fade Technique», popularizada por los chicos de 37signals, que no es mas que aplicar algun efecto a la zona modificada de manera que esta «resalte», y sea mucho mas sencillo para el usuario darse cuenta de las modificaciones.

En fin, no son mas que un par de consejos que nos permitiran, con mas o menos esfuerzo, seguir desarrollando con AJAX, pero teniendo en cuenta la accesibilidad. Pronto os colgare algun ejemplo practico de como llevar esto a cabo.
 

Chainsaw Buffet / AJAX y la accesibilidad web

Actualmente estamos viviendo el auge de la llamada «web 2.0», que se nos vende como una web mucho mas rica en contenidos, mas dinamica, y basada en aplicaciones web mas que en webs tradicionales. AJAX no es mas que una parte (importante, eso si) en todo este lio de tecnologias que engloba la «web 2.0», y es simplemente un conjunto de estandares (JavaScript, XML, HTML, CSS…). AJAX es a dia de hoy muy popular entre los desarrolladores, y Microsoft, evidentemente, no lo ignora y lanza su propia vision del asunto, a la que llama ASP.NET/AJAX, y que nos permite añadir a nuestras aplicaciones ASP.NET «de toda la vida» el dinamismo de AJAX sin necesidad de mancharnos las manos con sucio JavaScript (al cual no fui el unico en dar por muerto, verdad Salgado?). La pregunta es, hasta que punto este dinamismo, sin cuestionar ya su utilidad, llega a todo el mundo? O preguntando de forma mas tecnica…es AJAX accesible?

La respuesta es no…por el momento. Y las razones son bien sencillas, y no son mas que la absoluta dependencia que tiene AJAX de JavaScript y el refresco parcial de las paginas, y la mala relacion que tienen ambas cosas con los lectores de pantalla. La mayoria de los discapacitados que necesitan ayuda para acceder a la web utilizan un lector de pantalla, que se limita a leer lo que el navegador esta mostrando en pantalla. De ahi la insistencia en el uso de texto alternativo en las imagenes, al ser uno de los elementos que un lector de pantalla no puede interpretar. Vamos a ver un poco en detalle en que consisten estos dos problemas:

  • Dependencia de JavaScript. Browsers como Lynx o Links, no soportan JavaScript. Muchos lectores de pantalla (por suerte, cada vez menos), funcionan sobre Lynx. Y aunque funcionen sobre un browser que si soporte JavaScript, no lo interpretan, sino que intentan extraer algo con el suficiente sentido como para ser leido a un usuario, lo cual no es facil. Cuanto menos JavaScript haya en una web, mas sencillo sera leerla con un lector de pantalla, y AJAX tiende a aumentar cada vez mas el uso de JavaScript.
  • El refresco parcial de las paginas. Los lectores de pantalla, simplemente, no saben cuando una pagina ha sido actualizada «parcialmente». Para ellos, o se produce una actualizacion (y entonces leeran de nuevo la pantalla al usuario), o no se produce (y entonces no haran nada). Esto supone que una de las principales ventajas de AJAX (si no la mayor) sea no solo inutil, sino contraproducente.

En resumen, AJAX no se lleva bien con la accesibilidad web. Podemos solucionarlo? Pues parcialmente si, y lo veremos en un proximo post 😉

I Don’t Feel Like Dancin’ / Networking con Virtual PC

Aunque no lo parezca, conseguir tener en un mismo PC mas de uno y de dos Sistemas Operativos no es en absoluto dificil. Basta instalarte cualquier software de gestion de maquinas virtuales (VMWare o Virtual PC, por ejemplo), y puedes disponer, ademas de lo que hayas instalado en la maquina host (la unica maquina fisicamente visible, el cacharraco de encima de la mesa), un 2003 Server y un Windows XP donde instalar todas las betas, alphas y RC’s que quieras sin miedo a cargarte nada.

La cosa se pone un poco mas peliaguda cuando lo que queremos es que esa maquina se conecte a internet, ya sea para descargar actualizaciones o ficheros de video de los servidores mas concurridos de la red…Aqui os muestro la manera mas sencilla que he encontrado yo para conseguirlo, y es hacer que la maquina virtual salga a internet compartiendo la conexion del host mediante el Microsoft Loopback Adapter. Partiendo de una maquina host con Windows Vista, y una maquina virtual con el sistema operativo X, en Virtual PC…

  • Nos vamos al Control Panel
  • Pulsamos sobre «Add Hardware»
  • Elegimos la opcion «Advanced», que nos permitira seleccionar el hardware en una lista
  • Nos vamos a «Network adapters», y elegimos como fabricante Microsoft, y como producto el Microsoft Loopback Adapter

Con esto ya tenemos hecha la primera parte del asunto, y es tener montado el Loopback. Ahora lo que necesitamos es decir que vamos a compartir nuestra conexion de red con otros equipos a traves de el. Para esto, hacemos lo siguiente…

  • Nos vamos al Network and Sharing Center
  • Pulsamos sobre la opcion «View Status» de nuestra conexion de Internet, NO SOBRE LA CONEXION DE LOOPBACK,  y pulsamos sobre «Properties»
  • Seleccionamos la pestaña «Sharing»
  • Marcamos la opcion de «Allow other network users to connect through…», y en el desplegable seleccionamos Loopback

Y con esto ya tenemos la segunda parte, que es compartir nuestra conexion de internet a traves del Loopback. Acabar con el asunto es tan sencillo como arrancar Virtual PC y decirle en las propiedades de la maquina virtual que utilice como adaptador de red primario el Microsoft Loopback Adapter. Y listo para la conexion 🙂

Espero que os sea util
 

Copycat / He sido taggeado

Pues eso, que se supone que ahora deberia contar cinco cosas de mi que sepa poca o muy poca gente. O nadie. Y como parece que hay interes, porque no me han taggeado ni uno ni dos (sino tres, Ethel, Jorge y Doval), pues alla van. Luego no os quejeis 😛

  1. Me chiflan los RPG’s. Ya sea en un PC, con dados, con cartas, o con muñecajos, tengo un vicio que no me aguanto. Juego a Warhammer 40K desde hace unos 8 años, he coleccionado cartas de Magic (Mentira, no eran de Magic, eran de Pokemon!! Da lo mismo, a callar!!!), he estado un año y medio enganchado a Ultima Online y ahora juego al WoW, he jugado a n RPG’s en un PC y he disfrutado de muchisimos juegos de rol «clasico»,con sus dados y sus fichas de personaje. Mucho mucho vicio, mucho mucho dinero y, eso si, mucha mucha diversion.
  2. Durante 4 años hice Judo, hasta que me cambie de colegio. Llegue a ser cinturon naranja-verde, si no me equivoco. Hace ya bastante tiempo de eso 😛 Despues estuve un par de años practicando Tenis de Mesa, y ahora me (nos, verdad Doval) ha dado por la Esgrima. A ver lo que sale. Eso si, siempre he jugado al futbol de manera irregular, y siempre me han gustado deportes como el Kick-Boxing, o el Muay-Thai, pero mi fragilidiad fisica no me ayuda a animarme 😛
  3. Leo regularmente (vease a diario) un buen puñado de webcomics que, curiosamente, poca gente encuentra divertidos. Asi que me ahorrare el poner los links y tener que escuchar por n-esima vez eso de: «No le veo la gracia…»
  4. Aunque pueda parecer lo contrario, de niño nunca me llamaron los ordenadores ni la informatica. Es decir, no mas alla de «Papa monta el Spectrum», o «Papa dejame jugar al Atic Atac«. Sin embargo, si que me gustaba jugar con muñecas, y en el colegio en vez de jugar al futbol en el recreo me dedicaba a jugar con niñas y Barbies. Dios, esto empieza a ser humillante…
  5. Me encanta el dulce. Gominolas, chocolate, bombones…todo menos pasteles y tartas. Eso no 🙁 Y aunque no lo parezca dado mi esbelto fisico, como MUCHO. Preguntad si no os fiais 😛

Y ya esta, 5 cosas contadas. Ahora a ver lo que vais a acabar pensando de mi. Y como ya hay mucha gente taggeada que aun no ha respondido, se lo recuerdo yo. Cachero, Ricardo, Fran, Llopis y los compañeros de Plain que aun no se han animado…tardando estais 🙂

 

Wake the Snake / WPF y su UX

Ahhh, WPF…el Santo Grial de la programacion de interfaces de usuario, el nuevo paradigma de la presentacion grafica, el summum de los colores el pantalla, el…el…el que??


Empecemos pues por el principio. WPF es el nuevo susbistema de presentacion grafica incluido en el .NET Framework 3.0, centrando en la tan cacareada user experience. Bien. Y el Madrid que, otra vez campeon de Liga? Que es esto de user experience, o experiencia de usario? Pues no es mas que un esfuerzo por conseguir que los usuarios disfruten de aplicaciones que les permitan hacer las cosas de manera mas facil y mas atractiva.


Por que mas facil? Todos estamos hartos de aplicaciones de gestion de <inserteSuCosaAGestionar> que te obligan a pulsar 7 botones en 4 formularios distintos para cambiar de nombre a un usuario. Seamos serios, la mayoria de las interfaces de usuario de hoy en dia son simplemente malas. Son malas porque fallan en su principal objetivo, que es permitir al usuario hacer lo que quiere de la manera mas indolora posible. Eso es lo que pretende el concepto de UX, interfaces simples y efectivas. Ni mas, ni menos.


Por que mas atractiva? A todo amante de los coches le gustan los Ferraris. Ahora bien, si colocasemos a un F40 un chasis de 600…no seria lo mismo verdad? Tan importante como la funcionalidad de nuestra aplicacion es su aspecto. Es lo primero que va a ver el usuario, lo que marcara la primera impresion que se llevara de nuestra aplicacion. Y puede llegar a ser determinante en la manera que tenga de usarla…o de tirarla a la basura.


En resumen, UX es la calidad de la experiencia del usuario cuando interactua con nuestra aplicacion. Y nuestro objetivo, al menos el mio a dia de hoy, es hacer que tienda a infinito, utilizando WPF. Os interesa echarme una mano?