Share via


Control de eventos en Visual Basic y WPF

Para el lenguaje de Microsoft Visual Basic .NET en concreto, puede usar la palabra clave Handles específica del lenguaje para asociar controladores de eventos con instancias, en vez de adjuntar controladores de eventos con atributos o de utilizar el método AddHandler. Pero la técnica de Handles para adjuntar controladores a instancias tiene algunas limitaciones, ya que la sintaxis de Handles no es compatible con algunas de las características específicas de eventos enrutados del sistema de eventos de WPF.

Usar "Handles" en una aplicación WPF

Los controladores de eventos que se conectan a instancias y eventos con Handles deben definirse dentro de la declaración de clase parcial de la instancia, algo que también es un requisito para los controladores de eventos que se asignan a través de valores de atributo en los elementos. Solo se puede especificar Handles para un elemento de la página que tenga un valor de propiedad Name (o x:Name Directive declarado). Esto se debe a que Name en XAML crea la referencia de instancia necesaria para admitir el formato de referencia Instancia.Evento que requiere la sintaxis de Handles. El único elemento que se puede usar para Handles sin una referencia Name es la instancia de elemento raíz que define la clase parcial.

Puede asignar el mismo controlador a varios elementos. Para ello, separe con comas las referencias Instancia.Evento después de Handles.

Puede usar Handles para asignar más de un controlador a la misma referencia Instancia.Evento. No dé importancia al orden en el que se proporcionan los controladores en la referencia Handles, ya que se supone que los controladores que controlan el mismo evento se pueden invocar en cualquier orden.

Para quitar un controlador que se ha agregado con Handles en la declaración, puede llamar a RemoveHandler.

Puede usar Handles para asociar controladores para eventos enrutados, siempre y cuando asocie los controladores a instancias que definen el evento que se está controlando en sus tablas de miembros. En el caso de los eventos enrutados, los controladores asociados con Handles siguen las mismas reglas de enrutamiento que los controladores asociados como atributos XAML o con la firma común de AddHandler. Esto significa que si el evento ya está marcado como controlado (la propiedad Handled de los datos del evento es True), los controladores asociados con Handles no se invocan en respuesta a esa instancia de evento. El evento lo pueden marcar como controlado los controladores de instancia de otro elemento de la ruta o la clase que controla en el elemento actual o en elementos anteriores de la ruta. En el caso de los eventos de entrada que admiten eventos emparejados de túnel/propagación, la ruta de tunelización puede haber marcado como controlado el par de eventos. Para obtener más información sobre los eventos enrutados, vea Información general sobre eventos enrutados.

Limitaciones de "Handles" para agregar controladores

Handles no puede hacer referencia a controladores para eventos adjuntos. Debe usar el método de descriptor de acceso add para ese evento adjunto o atributos de evento nombreDeTipo.nombreDeEvento en XAML. Para obtener más información, vea Información general sobre eventos enrutados.

En el caso de los eventos enrutados, solo se puede usar Handles para asignar controladores a las instancias en las que ese evento existe en la tabla de miembros de instancia. Pero, en los eventos enrutados en general, un elemento primario puede ser un agente de escucha de un evento de elementos secundarios, incluso si el elemento primario no contiene ese evento en su tabla de miembros. En la sintaxis de atributo, puede especificar esto mediante un formato de atributo nombreDeTipo.nombreDeMiembro que califica el tipo que realmente define el evento que quiere controlar. Por ejemplo, un elemento Page primario (sin ningún evento Click definido) puede escuchar eventos de clic de botón. Para ello, se asigna un controlador de atributo en el formato Button.Click. Pero Handles no es compatible con el formato nombreDeTipo.nombreDeMiembro, porque debe admitir un formato Instancia.Evento que entra en conflicto. Para obtener más información, vea Información general sobre eventos enrutados.

Handles no puede adjuntar los controladores que se invocan para eventos que ya están marcados como controlados. En su lugar, debe usar código y llamar a la sobrecarga handledEventsToo de AddHandler(RoutedEvent, Delegate, Boolean).

Nota:

No use la sintaxis de Handles en código de Visual Basic al especificar un controlador de eventos para el mismo evento en XAML. En ese caso, se llama al controlador de eventos dos veces.

Cómo implementa WPF la funcionalidad "Handles"

Cuando se compila una página de lenguaje XAML, el archivo intermedio declara referencias FriendWithEvents a cada elemento de la página que tenga una propiedad Name establecida (o x:Name Directive declarado). Cada instancia con nombre es potencialmente un elemento que se puede asignar a un controlador mediante Handles.

Nota:

En Visual Studio, IntelliSense puede mostrar la finalización de los elementos que están disponibles para una referencia Handles en una página. Sin embargo, esto podría ocupar un paso de compilación para que el archivo intermedio pueda rellenar todas las referencias Friends.

Vea también