Manejo de eventos.

Eventos enrutados.

Hasta ahora hemos visto aspectos de diseño de los controles contenidos en las ventanas. Hemos aprendido su inclusión en el lenguaje XAML y hemos ido viendo las diferentes propiedades de cada uno, la mayoría propiedades comunes a todos los controles, y cómo afecta el cambio de los valores de estas propiedades a la apariencia y comnportamiento de los controles. Sin embargo, aún no podemos hacer nada útil con estos controles, es decir, de poco nos vale diseñar un botón a nuestro gusto si no podemos hacer nada con él cuando, por ejemplo, lo pulsamos. Para poder sacar el rendimiento pleno a las funcionalidades de los controles, debemos hacer uso de los eventos.

Un evento es la funcionalidad de un control, es decir, el mensaje que un control envía a algún otro objeto. Dicho de otro modo, un evento es la acción que se realiza cuando el usuario haga un uso directo de dicho control, como por ejemplo pulsar un botón, o rellenar una caja de texto, o abrir un desplegable.

Los eventos que produce un control se manipulan a través de un manejador de eventos, que no es otra cosa sino un objeto en el que el control delega la tarea de manipular un tipo particular de evento. Como esto suena un poco complicado, imagina que un manejador de evento es un objeto que se encarga de la llamada a un método programado para ello en el momento que se dispara el evento. Una imagen vala más que mil palabras:

<Button Name="button1" Content="Haga click aquí" Click="button1_Click"/>

Ahora vamos al archivo 'MainWindow.xaml.cs', es decir, el archivo C# de código subyacente propio de la ventana principal. Como verás, Visual Studio ha creado automáticamente un método asociado al evento 'Click' del botón, con el mismo nombre de método que el que se indica en el archivo XAML. Hab´ras deducido que, en el momento que el usuario pulse el botón, se disparará el evento 'Click' y la ejecución pasará automáticamente al método indicado en el evento.

private void button1_Click(object sender, RoutedEventArgs e)
{

}

Ahora disponemos de un método asociado al evento 'Click' del botón que únicamente recibirá llamada cuando se produzca este evento en este control en particular, y no en ninguno otro cualquiera. Podemos crear código fuente dentro de este método para realizar las acciones que queramos.

private void button1_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("¡Control '" + (sender as Button).Name + "' pulsado!");
    Console.Beep(1000 , 100);
}

Observa que hemos hecho uso de uno de los parámetros del método, el parámetro 'sender', que representa el objeto que ha producido el evento, en este caso el control 'button1'. El segundo parámetro, 'e', especifica los datos para el evento, pero sobre este segundo parámetro actuarás muy pocas veces en la práctica. Sin embargo, lo dicho sobre el primer parámetro puede no ser exacto en algunos casos, pues el elemento que representa ese parámetro puede no ser el original, sino que, al tratarse de eventos enrutados, pueda haber sido transformado en el elemento superior de la raíz de elementos establecidos en el código XAML. Por ejemplo, un evento enrutado de un botón pasará al contenedor que lo contiene, y finalmente pasará a la ventana en la que está contenido todo. Pero no te preocupes por esta particularidad, pues por lo general no será necesario que vayas "siguiendoo la pista" a los eventos enrutados; no obstante, la propiedad 'Source' del parámetro 'e' te podrá dar la pista del evento enrutado.

Eventos adjuntos.

Podemos hacer referencia en el código XAML de un evento no sobre el control que lo dispara, sino sobre, por ejemplo, el contenedor que lo contiene:

<Grid Button.Click="buttons_Click">
    <Button Name="button1" Content="Botón 1"/>
    <Button Name="button2" Content="Botón 2"/>
    <Button Name="button3" Content="Botón 3"/>
</Grid>

Lo que conseguimos de esta manera es que el contenedor 'Grid' está atento a todos los eventos que puedan producirse en todos y cada uno de los controles 'Button' contenidos en él, inddependientemente de cuál de ellos haya disparado el evento. En este caso sí será útil hacer uso de la propiedad 'Source' del parámetro 'e' para conocer exactamente cuál de los botones ha disparado el evento.