Come aggiungere un gestore eventi usando il codice (WPF .NET)

È possibile assegnare un gestore eventi a un elemento in Windows Presentation Foundation (WPF) usando markup o code-behind. Anche se è consuetudine assegnare un gestore eventi in XAML (Extensible Application Markup Language), a volte potrebbe essere necessario assegnare un gestore eventi nel code-behind. Ad esempio, usare il codice quando:

  • Assegnare un gestore eventi a un elemento dopo la pagina di markup che contiene l'elemento caricato.
  • Aggiungere un elemento e assegnare il relativo gestore eventi dopo la pagina di markup che conterrà il caricamento dell'elemento.
  • Si definisce l'albero degli elementi per l'applicazione interamente nel codice.

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 per l'assegnazione del gestore eventi

C# supporta l'assegnazione del gestore eventi usando:

  • += Operatore , che viene usato anche nel modello di gestione degli eventi CLR (Common Language Runtime).
  • Metodo UIElement.AddHandler .

VB supporta l'assegnazione del gestore eventi tramite:

  • Istruzione AddHandler con l'operatore AddressOf , che viene usata anche nel modello di gestione degli eventi CLR.
  • Parola chiave Handle nella definizione del gestore eventi. Per altre informazioni, vedere Gestione degli eventi di Visual Basic e WPF.
  • Metodo UIElement.AddHandler , insieme all'operatore AddressOf per fare riferimento al gestore eventi.

Esempio

L'esempio seguente usa XAML per definire un Button oggetto denominato ButtonCreatedByXaml e per assegnare il ButtonCreatedByXaml_Click metodo come Click gestore eventi. Click è un evento predefinito indirizzato per i pulsanti che derivano da ButtonBase.

<StackPanel Name="StackPanel1">
    <Button
        Name="ButtonCreatedByXaml" 
        Click="ButtonCreatedByXaml_Click"
        Content="Create a new button with an event handler"
        Background="LightGray">
    </Button>
</StackPanel>

Nell'esempio viene usato il code-behind per implementare i ButtonCreatedByXaml_Click gestori e ButtonCreatedByCode_Click e per assegnare il ButtonCreatedByCode_Click gestore agli ButtonCreatedByCode elementi e StackPanel1 . I metodi del gestore eventi possono essere implementati solo nel code-behind.

// The click event handler for the existing button 'ButtonCreatedByXaml'.
private void ButtonCreatedByXaml_Click(object sender, RoutedEventArgs e)
{
    // Create a new button.
    Button ButtonCreatedByCode = new();

    // Specify button properties.
    ButtonCreatedByCode.Name = "ButtonCreatedByCode";
    ButtonCreatedByCode.Content = "New button and event handler created in code";
    ButtonCreatedByCode.Background = Brushes.Yellow;

    // Add the new button to the StackPanel.
    StackPanel1.Children.Add(ButtonCreatedByCode);

    // Assign an event handler to the new button using the '+=' operator.
    ButtonCreatedByCode.Click += new RoutedEventHandler(ButtonCreatedByCode_Click);

    // Assign an event handler to the new button using the AddHandler method.
    // AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click);

    // Assign an event handler to the StackPanel using the AddHandler method.
    StackPanel1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click));
}

// The Click event handler for the new button 'ButtonCreatedByCode'.
private void ButtonCreatedByCode_Click(object sender, RoutedEventArgs e)
{
    string sourceName = ((FrameworkElement)e.Source).Name;
    string senderName = ((FrameworkElement)sender).Name;

    Debug.WriteLine($"Routed event handler attached to {senderName}, " +
        $"triggered by the Click routed event raised by {sourceName}.");
}
' The click event handler for the existing button 'ButtonCreatedByXaml'.
Private Sub ButtonCreatedByXaml_Click(sender As Object, e As RoutedEventArgs)

    ' Create a new button and specify button properties.
    Dim ButtonCreatedByCode As New Button With {
        .Name = "ButtonCreatedByCode",
        .Content = "New button and event handler created in code",
        .Background = Brushes.Yellow
    }

    ' Add the new button to the StackPanel.
    StackPanel1.Children.Add(ButtonCreatedByCode)

    ' Assign an event handler to the new button using the AddHandler statement.
    AddHandler ButtonCreatedByCode.Click, AddressOf ButtonCreatedByCode_Click

    ' Assign an event handler to the new button using the AddHandler method.
    ' ButtonCreatedByCode.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))

    ' Assign an event handler to the StackPanel using the AddHandler method.
    StackPanel1.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))

End Sub

' The Click event handler for the new button 'ButtonCreatedByCode'.
Private Sub ButtonCreatedByCode_Click(sender As Object, e As RoutedEventArgs)

    Dim sourceName As String = CType(e.Source, FrameworkElement).Name
    Dim senderName As String = CType(sender, FrameworkElement).Name

    Debug.WriteLine($"Routed event handler attached to {senderName}, " +
        $"triggered by the Click routed event raised by {sourceName}.")

End Sub

Quando ButtonCreatedByXaml si fa clic e il relativo gestore eventi viene eseguito a ButtonCreatedByXaml_Click livello di codice:

  1. Aggiunge un nuovo pulsante denominato ButtonCreatedByCode all'albero degli elementi XAML già costruito.
  2. Specifica le proprietà per il nuovo pulsante, ad esempio il nome, il contenuto e il colore di sfondo.
  3. Assegna il ButtonCreatedByCode_Click gestore eventi a ButtonCreatedByCode.
  4. Assegna lo stesso ButtonCreatedByCode_Click gestore eventi a StackPanel1.

Quando ButtonCreatedByCode si fa clic su:

  1. L'evento Click indirizzato viene generato su ButtonCreatedByCode.
  2. Viene attivato il ButtonCreatedByCode_Click gestore eventi assegnato a ButtonCreatedByCode .
  3. L'evento Click indirizzato attraversa l'albero degli elementi a StackPanel1.
  4. Viene attivato il ButtonCreatedByCode_Click gestore eventi assegnato a StackPanel1 .
  5. L'evento Click indirizzato continua l'albero degli elementi attivando potenzialmente altri Click gestori eventi assegnati ad altri elementi attraversati.

Il ButtonCreatedByCode_Click gestore eventi ottiene le informazioni seguenti sull'evento che lo ha attivato:

  • Oggetto sender , ovvero l'elemento a cui è assegnato il gestore eventi. sender sarà ButtonCreatedByCode la prima volta che viene eseguito il gestore e StackPanel1 la seconda volta.
  • Oggetto RoutedEventArgs.Source , ovvero l'elemento che ha originariamente generato l'evento. In questo esempio, è Source sempre ButtonCreatedByCode.

Nota

Una differenza fondamentale tra un evento indirizzato e un evento CLR consiste nel fatto che un evento indirizzato attraversa l'albero degli elementi, cercando gestori, mentre un evento CLR non attraversa l'albero degli elementi e i gestori possono essere collegati solo all'oggetto di origine che ha generato l'evento. Di conseguenza, un evento sender indirizzato può essere qualsiasi elemento attraversato nell'albero degli elementi.

Per altre informazioni su come creare e gestire eventi indirizzati, vedere Come creare un evento indirizzato personalizzato e Gestire un evento indirizzato.

Vedi anche