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

Se você estiver codificando no Visual Basic .NET, poderá usar a palavra-chave Handles específica da linguagem 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 WPF (Windows Presentation Foundation). No entanto, Handles tem algumas limitações de uso quando usado para anexar manipuladores de eventos para eventos roteados.

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 WPF (Windows Presentation Foundation).

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 <event name> for gerado em um objeto especificado por <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 Handles.

' 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 no 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 WithEvents. 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 eventos por vírgula <object name>.<event name> . Por exemplo, Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click. A ordem dos eventos separados por vírgula é irrelevante.

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 na qual os manipuladores são invocados 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 or x:Name é declarado como Friend WithEvents. Como resultado, você pode usar qualquer elemento XAML com Handles.

Dica

O 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 AddHandler método, o comportamento do sistema de eventos é o 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 Click manipulador de eventos a um botão cuja classe ButtonBase base gera o Click evento roteado. No entanto, um dos recursos dos eventos roteados é que eles atravessam a árvore de elementos, o que possibilita escutar e manipular um Click evento em um nível mais alto do que o elemento que o gerou. 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 dá suporte à especificação de um ouvinte diferente na árvore de elementos XAML do 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 dá suporte à invocação do manipulador de eventos para Handled eventos. Para permitir que o manipulador de eventos seja invocado 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