Manipulação de eventos do Visual Basic e WPF (WPF .NET)

Se você estiver codificando no Visual Basic .NET, você pode usar a palavra-chave Handles específica do idioma para anexar um manipulador de eventos a um objeto. O objeto pode ser uma instância em code-behind ou um elemento em XAML (Extensible Application Markup Language). Handlespode ser usado para atribuir manipuladores de eventos para eventos CLR (Common Language Runtime) ou eventos roteados do Windows Presentation Foundation (WPF). No entanto, Handles tem algumas limitações de uso quando usado para anexar manipuladores de eventos para eventos roteados.

Importante

A documentação do Guia da Área de Trabalho para .NET 7 e .NET 6 está em construção.

Pré-requisitos

O artigo pressupõe um conhecimento básico de eventos roteados e que você leu Visão geral de eventos roteados. Para seguir os exemplos neste artigo, é útil se você estiver familiarizado com XAML (Extensible Application Markup Language) e souber como escrever aplicativos Windows Presentation Foundation (WPF).

Sintaxe

A sintaxe de uma Sub declaração que usa a palavra-chave Handles é: Sub <procedure name> Handles <object name>.<event name>. Essa sintaxe designa um procedimento como o manipulador de eventos que será executado quando um evento especificado por for gerado em um objeto especificado por <event name><object name>. O evento deve ser um membro da classe ou classe base do objeto. O exemplo a seguir mostra como anexar um manipulador de eventos a um elemento XAML usando Handleso .

' Click event handler attached to XamlButton using Handles.
Private Sub XamlButton_Click(sender As Object, e As RoutedEventArgs) Handles XamlButton.Click

    ' Handler logic.
    Debug.WriteLine($"Click event handler attached to XamlButton using Handles.")

End Sub

Para usar Handles com um objeto definido em code-behind, normalmente você declara o objeto usando a palavra-chave WithEvents . Para obter mais informações sobre WithEvents o uso, consulte estes exemplos. O WPF declara automaticamente todos os elementos XAML usando Friend WithEventso . O exemplo a seguir mostra como declarar um objeto definido em code-behind usando WithEvents.

' Declare a new button using WithEvents.
Dim WithEvents CodeButton As New Button With {
    .Content = "New button",
    .Background = Brushes.Yellow
}

' Click event handler attached to CodeButton using Handles.
Private Sub CodeButton_Click(sender As Object, e As RoutedEventArgs) Handles CodeButton.Click

    ' Handler logic.
    Debug.WriteLine($"Click event handler attached to CodeButton using Handles.")

End Sub

Para usar o mesmo manipulador para vários eventos, separe os <object name>.<event name> eventos por vírgula. Por exemplo, Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click. A ordem dos eventos separados por vírgulas é imaterial.

Você pode atribuir manipuladores diferentes para o mesmo evento com várias Handles instruções. A ordem das Handles instruções não determina a ordem em que os manipuladores são chamados quando o evento ocorre.

Dica

Para remover um manipulador que foi adicionado com Handles, chame RemoveHandler. Por exemplo, RemoveHandler Button1.Click, AddressOf Button1_Click.

Usando 'Handles' em um aplicativo WPF

Para um objeto definido em XAML, a sintaxe do evento Handles requer que o elemento XAML que representa o objeto tenha uma Name propriedade ou x:Name.<object name>.<event name> No entanto, uma propriedade name não é necessária para o elemento raiz da página XAML, para o qual você pode usar o nome Me. O exemplo a seguir mostra como anexar um manipulador de eventos a uma raiz de página XAML usando Handles.

' Loaded event handler attached to the XAML page root using Handles.
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

    ' Handler logic.
    Debug.WriteLine($"Loaded event handler attached to Window using Handles.")

End Sub

Quando uma página XAML é compilada, cada elemento XAML com um Name parâmetro ou x:Name é declarado como Friend WithEvents. Como resultado, você pode usar qualquer elemento XAML com Handleso .

Dica

Visual Studio IntelliSense mostra os objetos que podem ser usados com Handleso .

Independentemente de você anexar um manipulador de eventos usando Handlesa sintaxe de atributo , XAML, a instrução AddHandler ou o método, o comportamento do sistema de eventos é o AddHandler mesmo.

Observação

Não use os dois atributos XAML e Handles anexe o mesmo manipulador de eventos ao mesmo evento, caso contrário, o manipulador de eventos será chamado duas vezes para cada evento.

Limitações

A palavra-chave Handles tem estas limitações de uso:

  • Você só pode usar Handles para anexar um manipulador de eventos a um objeto se o evento for um membro da classe ou classe base do objeto. Por exemplo, você pode usar Handles para anexar um manipulador de eventos a um Click botão cuja classe ButtonBase base gera o Click evento roteado. No entanto, uma das características dos eventos roteados é que eles atravessam a árvore de elementos, o que torna possível ouvir e manipular um evento em um Click nível mais alto do que o elemento que o elevou. Um evento roteado que um elemento pai escuta e manipula é chamado de evento anexado. Handles não pode ser usado para eventos anexados porque sua sintaxe não oferece suporte à especificação de um ouvinte diferente na árvore de elementos XAML do que o elemento que gerou o evento. Para atribuir manipuladores de eventos para eventos anexados, você precisará usar a sintaxe de atributo XAML ou o AddHandler método. Para obter mais informações sobre eventos anexados, consulte Visão geral de eventos anexados e Eventos anexados no WPF.

  • Handles A sintaxe não oferece suporte à invocação do manipulador de eventos para Handled eventos. Para permitir que o manipulador de eventos seja chamado para Handled eventos, anexe o manipulador de eventos usando o AddHandler(RoutedEvent, Delegate, Boolean) método e defina seu handledEventsToo parâmetro como true.

Confira também