Gestione degli eventi di Visual Basic e WPF (WPF .NET)

Se si sta codificando in Visual Basic .NET, è possibile usare la parola chiave Handle specifica del linguaggio per associare un gestore eventi a un oggetto . L'oggetto può essere un'istanza nel code-behind o un elemento nel linguaggio XAML (Extensible Application Markup Language). Handlespuò essere usato per assegnare gestori eventi per eventi CLR (Common Language Runtime) o eventi indirizzati di Windows Presentation Foundation (WPF). Tuttavia, Handles presenta alcune limitazioni di utilizzo quando viene usato per collegare gestori eventi per gli eventi indirizzati.

Importante

La documentazione di Desktop Guide per .NET 7 e .NET 6 è in fase di costruzione.

Prerequisiti

L'articolo presuppone una conoscenza di base degli eventi indirizzati e di aver letto panoramica degli eventi indirizzati. Per seguire gli esempi in questo articolo, è utile se si ha familiarità con Extensible Application Markup Language (XAML) e si sa come scrivere applicazioni Windows Presentation Foundation (WPF).

Sintassi

La sintassi per una Sub dichiarazione che usa la parola chiave Handle è: Sub <procedure name> Handles <object name>.<event name>. Tale sintassi definisce una routine come gestore eventi che verrà eseguita quando viene generato un evento specificato da <event name> su un oggetto specificato da <object name>. L'evento deve essere un membro della classe o della classe base dell'oggetto. L'esempio seguente illustra come associare un gestore eventi a un 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

Per usare Handles con un oggetto definito nel code-behind, in genere si dichiara l'oggetto usando la parola chiave WithEvents . Per altre informazioni sull'utilizzo WithEvents , vedere questi esempi. WPF dichiara automaticamente tutti gli elementi XAML usando Friend WithEvents. Nell'esempio seguente viene illustrato come dichiarare un oggetto definito nel 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

Per usare lo stesso gestore per più eventi, separare gli <object name>.<event name> eventi da virgole. Ad esempio, Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click. L'ordine degli eventi delimitati da virgole è irrilevante.

È possibile assegnare gestori diversi per lo stesso evento con più Handles istruzioni. L'ordine Handles delle istruzioni non determina l'ordine in cui i gestori vengono richiamati quando si verifica l'evento.

Suggerimento

Per rimuovere un gestore aggiunto con Handles, chiamare RemoveHandler. Ad esempio, RemoveHandler Button1.Click, AddressOf Button1_Click.

Uso di "Handle" in un'applicazione WPF

Per un oggetto definito in XAML, la sintassi <object name>.<event name> degli eventi Handle richiede che l'elemento XAML che rappresenta l'oggetto abbia una Name proprietà o x:Name. Tuttavia, non è necessaria una proprietà name per l'elemento radice della pagina XAML, per cui è possibile usare il nome Me. L'esempio seguente mostra come associare un gestore eventi a una radice di pagina 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 viene compilata una pagina XAML, ogni elemento XAML con un Name parametro o x:Name viene dichiarato come Friend WithEvents. Di conseguenza, puoi usare qualsiasi elemento XAML con Handles.

Suggerimento

Visual Studio IntelliSense mostra gli oggetti che possono essere usati con Handles.

Indipendentemente dal fatto che si allega un gestore eventi usando Handles, la sintassi dell'attributo XAML, l'istruzione AddHandler o il AddHandler metodo , il comportamento del sistema eventi è lo stesso.

Nota

Non usare entrambi gli attributi XAML e Handles per associare lo stesso gestore eventi allo stesso evento. In caso contrario, il gestore eventi verrà chiamato due volte per ogni evento.

Limiti

La parola chiave Handle presenta queste limitazioni di utilizzo:

  • È possibile utilizzare Handles solo per associare un gestore eventi a un oggetto se l'evento è un membro della classe o della classe base dell'oggetto. Ad esempio, è possibile usare Handles per associare un Click gestore eventi a un pulsante la cui classe ButtonBase di base genera l'evento Click indirizzato. Tuttavia, una delle funzionalità degli eventi indirizzati consiste nel fatto che attraversano l'albero degli elementi, che consente di ascoltare e gestire un Click evento a un livello superiore rispetto all'elemento che l'ha generata. Un evento indirizzato per cui un elemento padre è in ascolto e handle viene chiamato evento associato. Handles non può essere usato per gli eventi associati perché la sintassi non supporta la specifica di un listener diverso nell'albero degli elementi XAML rispetto all'elemento che ha generato l'evento. Per assegnare gestori eventi per gli eventi associati, dovrai usare la sintassi degli attributi XAML o il AddHandler metodo . Per altre informazioni sugli eventi associati, vedere Panoramica degli eventi associati ed Eventi associati in WPF.

  • Handles la sintassi non supporta la chiamata del gestore eventi per Handled gli eventi. Per abilitare il gestore eventi da richiamare per Handled gli eventi, collegare il gestore eventi usando il metodo e impostarne handledEventsToo il AddHandler(RoutedEvent, Delegate, Boolean) parametro su true.

Vedi anche