Crear Eventos Enrutados
Bueno hola a todo el mundo después de mucho tiempo vuelvo a seguir con los eventos, espero algún día terminar jajaja, estoy muy vago pero bueno voy a tratar de escribir 1 articulo por semana ya que el laburo me tiene complicado tengo que terminar y me parece que me va a pasar algo a al 99% de los desarrolladores nos pasa no terminar a tiempo jajaja, me rio para no llorar, bueno me dejo de llorar y arrancamos con la creación de un evento, primero voy a pegar una imagen muy ilustrativa de la diferencia entre los eventos de tipo burbuja suben por el árbol y los de tipo túnel que bajan por el arbolito de elementos.
Ahora que nos acordamos de cómo funcionaban vamos a comenzar, …… a seguir repasando conceptos son necesarios, el modelo de estos eventos es muy similar a lo que son las propiedades de dependencia, ya vamos hablar de esto cuando termine con los eventos, si ya sé que tendría que haber arrancado con eso primero pero yo les digo que no porque nosotros arrancamos hablando de eventos básico los que usábamos en el querido WinForm y ahora tocamos los nuevos eventos que los podemos usar en WPF o Silverlight.
Para el ejemplo vamos a ver la clase Button, y el evento Click:
public abstract class ButtonBase : ContentControl, ...
{
//Aca definimos el evento – que es el conocido Click
public static readonly RoutedEvent ClickEvent;
//Registramos el eventos
static ButtonBase()
{
ButtonBase.ClickEvent = EventManager.RegisterRoutedEvent(
"Click", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(ButtonBase));
...
}
// Encapsulamos el evento
public event RoutedEventHandler Click
{
add
{
base.AddHandler(ButtonBase.ClickEvent, value);
}
remove
{
base.RemoveHandler(ButtonBase.ClickEvent, value);
}
}
...
}
Para resumir de una manera muy básica son 3 pasos:
- Definimos
- Registramos
- Encapsulamos
Como se los describo es facilísimo, aunque no sé si es tan fácil, pero para que se queden contentos les voy a decir que si, después cuando creen sus eventos seguramente se van acordar de mi, espero que de buena manera.
Un breve repaso, EventManager.RegisterRoutedEvent(….)
public static RoutedEvent RegisterRoutedEvent(
stringname,
RoutingStrategy routingStrategy,
Type handlerType,
Type ownerType
)
Esto es importante que lo sepamos como dijimos a la hora de registrar el evento le vamos a poner un nombre que puede ser lo que se les ocurra pero lo ideal es mantener una relación coherente no como normalmente hago yo que le pongo cualquier cosa, y después cuando dejo el proyecto por 2 semanas tengo que tomarme 4 meses para saber que carajo hice, no hagan como yo hagan las cosas bien muchas veces cuenta pero a la larga es mejor se los digo por experiencia propia.
El segundo parámetro es el tipo directo, túnel o burbuja, el tercero es el tipo del controlador del evento que por defecto es RoutedEventHandler, y el cuarto es la clase en donde esta definido el evento en el caso del ejemplo es ButtonBase.
Y el ultimo paso es encapsular, para despedirme voy a poner el ejemplo en el que le puse un nombre y al encapsulamiento otro distinto pero es un error menor aunque lo ideal es evitarlo.
#region EVENTOS
public static readonly RoutedEvent DatoChangedEvent =
EventManager.RegisterRoutedEvent( "Selected", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(ArribaAbajo));
public event RoutedEventHandler DatoChanged
{
add { AddHandler(DatoChangedEvent, value); }
remove { RemoveHandler(DatoChangedEvent, value); }
}
#endregion
Ahí en mi ejemplo el paso 1 y 2 los hago juntos, y lo que les decía que eviten yo ahí nombre el evento como “Selected” y después lo encapsulo como DatoChanged, pero bueno son cosas que pasan.
Lo puedo lanzar de la siguiente manera:
arribaAbajoAñosRecidencia.DatoChanged +=
new RoutedEventHandler(arribaAbajoAñosRecidencia_DatoChanged);
void arribaAbajoAñosRecidencia_DatoChanged(object sender, RoutedEventArgs e)
{
throw new NotImplementedException();
}
Y podría dispáralo de la siguiente manera:
//creo el evento
RoutedEventArgs args = new RoutedEventArgs(DatoChangedEvent);
//disparo
RaiseEvent(args);
Ahora si mis queridos lectores, me despido hasta la próxima creo que ya podemos decir que tenemos una idea general de todo, por el código de ejemplo no se asusten si no me entendieron en el próximo tutorial, el 7 que es donde voy a dar por finalizado el tema voy a crear un control de usuario o extender un control como por ejemplo un textbox y agregarle un evento y llamarlo, lanzarlo, matarlo……….., etc, igual siempre algo nuevo sale y cuando eso pase seguramente armare algún artículo como para llevar el actualizado el tema.