Doble Click en Silverlight usando Behaviors

Silverlight no tiene soporte en los UIElement para el evento Doble Click. Pero con Silverlight 3 y Blend 3 es sencillo desarrollar una solución genérica para todos los UIElement y extenderlos con el evento Doble Click.

Para ello usaremos la librería System.Windows.Interactivity que se encuentra en el SDK de Expression Blend 3 (%programfiles%Microsoft SDKsExpressionblend InteractivityLibrariesSilverlight”). Una vez que ya tengamos esa librería referenciada en nuestro proyecto, debemos crear un Behavior:

using System.Windows;
using System.Windows.Interactivity;

public class MouseDoubleClickBehavior : Behavior<UIElement>
{
    
}

Como veis lo hacemos genérico para cualquier UIElement, ya que es la clase base de todos los elementos que tienen los eventos del ratón. Para trabajar con los Behavoirs debemos sobrescribir varios métodos de la clase base:

private AutomationPeer Peer { get; set; }

protected override void OnAttached()
{
    Peer = FrameworkElementAutomationPeer.FromElement(AssociatedObject) ??
           FrameworkElementAutomationPeer.CreatePeerForElement(AssociatedObject);

    AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp;
    base.OnAttached();
}

protected override void OnDetaching()
{
    AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp;
    base.OnDetaching();
}

Con estos métodos podemos controlar cuando el Behavior se asociada y se desasocia, debemos usar la clase AutimationPeer para darle funcionalidad al objeto AssociatedObject. Y ese mismo objeto de tipo UIElement es con el que nos subscribiremos al evento MouseLeftButton. Como veis tenemos ahí el controlador AssociatedObject_MouseLeftButtonUp, que el que dará la lógica a nuestro behavior:

private bool _waiting;
private DateTime _waitingSince;

private void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if (_waiting)
    {
        if (DateTime.Now.Subtract(_waitingSince).Milliseconds < Interval)
            OnMouseDoubleClick(e);
        _waiting = false;
    }
    else
    {
        _waiting = true;
        _waitingSince = DateTime.Now;
    }
}

private void OnMouseDoubleClick(MouseButtonEventArgs args)
{
    if (MouseDoubleClick != null)
        MouseDoubleClick(AssociatedObject, args);
}

public event MouseButtonEventHandler MouseDoubleClick;
private int _interval = 500;
public int Interval
{
    get { return _interval; }
    set { _interval = value; }
}

La lógica como veis es sencilla, hemos creado el evento MouseDoubleClick y en caso de que ya hayamos hecho un Click y el tiempo sea menor al que le establecemos en la propiedad Interval (Por defecto le pongo 500), el evento será lanzado.

Con esto ya podríamos en el XAML hacer algo parecido a los siguiente:

<Image>
	<i:Interaction.Behaviors>
		<my:MouseDoubleClickBehavior
            MouseDoubleClick="MouseDoubleClick" 
            Interval="500" />
	</i:Interaction.Behaviors>
</Image>

Y así ya podríamos añadirlo a todos los controles que deriven de UIElement que tengamos.

En otro artículo os comentaré como solucionar el Scroll con el Mouse Wheel usando otro Behavior 😉

Gestalt Beta, azúcar para la web

Desde los MIX Online Labs, nos traen un nuevo producto beta que tiene muy buena pinta. La descripción oficial es:

“Gestalt es una librería liberada por MIX Online Labs que te permite escribir código Ruby, Python y XAML en tus páginas (X)HTML. Te permite construir aplicaciones ricas y más poderosas casando los beneficios de lenguajes expresivos, modernos compiladores, AJAX y RIAs con el modelo de desarrollo escribe>guarda>refresca de la Web”

Sus características nos las venden así:

Haz hueco para Ruby y Python, Javascript

XAML para gráficos avanzados

Compilación transparente y flamante velocidad

Mira mamá, ¡sin herramientas!

Llevando el SEO (Optimización de Motores de Búsqueda) al siguiente nivel

Yo soy un Mac, yo soy un PC

Para ver que dicen de ellos, pasaros por la página del proyecto.

Un primer ejemplo que nos enseñan es el siguiente:

<html>
<head>
  <script src="js/jquery.js" type="text/javascript"></script>
  <script src="js/gestalt.js" type="text/javascript"></script> 
</head>
<body>

<input id="say_hello" type="button" value="Say, Hello!" />

<script language="ruby">
document.say_hello.onclick do |s,e|
  window.alert "Hello, World!"
end
</script>
</body>
</html>

Y esa es la forma de crear un botón que dice “Hello, World!” usando Ruby.

Sinceramente es una pasada, se pueden crear animaciones con XAML y todo.

Proyecto Gestalt: http://www.visitmix.com/Labs/gestalt/

.NUGG: Speed of Light: Optimización de SQL Server

Esta sesión está dedicada a detallar las técnicas y herramientas que nos permitirán exprimir el rendimiento de nuestro SQL Server al máximo, haciendo un repaso por la teoría implicada, y pasando directamente a ejemplos del Mundo Real™. Se abordarán buenas prácticas de indizado, las consideraciones de almacenamiento más relevantes, el análisis de planes de ejecución, así como la utilización de nuevas características de SQL Server 2008 para optimizar cargas de trabajo.

1.- Arquitectura general de SQL Server

2.- Metodología Waits & Queues: Monitorización de Esperas en SQL Server

3.- Optimización de Almacenamiento

4.- Optimización del Uso de Memoria

5.- Aislamiento Transaccional

6.- Optimización de Consultas

Fecha y hora:

17 de julio de 2009 : 17:00 a 19:00

Dirección:

Edificio Xoana Capdevielle
Campus de Elviña s/n
A Coruña – 15071

Registro:

http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032421168&Culture=es-ES

Cómo llegar:

http://maps.google.es/maps/ms?ie=UTF8&hl=es&msa=0&msid=112446040967221334224.00044475947d03a539b25&t=h&z=15