Comment ajouter un gestionnaire d’événements à l’aide du code (WPF .NET)

Vous pouvez affecter un gestionnaire d’événements à un élément de Windows Presentation Foundation (WPF) à l’aide du balisage ou du code-behind. Bien qu’il soit habituel d’affecter un gestionnaire d’événements en XAML (Extensible Application Markup Language), vous devrez peut-être affecter un gestionnaire d’événements dans code-behind. Par exemple, utilisez du code quand :

  • Vous affectez un gestionnaire d’événements à un élément après la page de balisage qui contient l’élément chargé.
  • Vous ajoutez un élément et attribuez son gestionnaire d’événements après la page de balisage qui contiendra les chargements d’éléments.
  • Vous définissez entièrement l’arborescence d’éléments pour votre application dans le code.

Important

La documentation du Guide du bureau pour .NET 7 et .NET 6 est en cours de construction.

Prérequis

L’article suppose une connaissance de base des événements routés et que vous avez lu la vue d’ensemble des événements routés. Pour suivre les exemples de cet article, il vous aide à connaître le langage XAML (Extensible Application Markup Language) et savoir comment écrire des applications Windows Presentation Foundation (WPF).

Syntaxe pour l’affectation de gestionnaire d’événements

C# prend en charge l’attribution de gestionnaire d’événements à l’aide de :

  • L’opérateur += , qui est également utilisé dans le modèle de gestion des événements CLR (Common Language Runtime).
  • Méthode UIElement.AddHandler

VB prend en charge l’attribution de gestionnaire d’événements à l’aide de :

  • Instruction AddHandler avec l’opérateur AddressOf , qui est également utilisée dans le modèle de gestion des événements CLR.
  • Handles mot clé dans la définition du gestionnaire d’événements. Pour plus d’informations, consultez gestion des événements Visual Basic et WPF.
  • Méthode UIElement.AddHandler , avec l’opérateur AddressOf pour référencer le gestionnaire d’événements.

Exemple

L’exemple suivant utilise XAML pour définir un Button nom ButtonCreatedByXaml et affecter la ButtonCreatedByXaml_Click méthode en tant que Click gestionnaire d’événements. Click est un événement routé intégré pour les boutons qui dérivent de ButtonBase.

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

L’exemple utilise le code-behind pour implémenter les ButtonCreatedByXaml_Click gestionnaires et ButtonCreatedByCode_Click pour affecter le ButtonCreatedByCode_Click gestionnaire aux éléments et StackPanel1 aux ButtonCreatedByCode éléments. Les méthodes de gestionnaire d’événements ne peuvent être implémentées que dans 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

Quand ButtonCreatedByXaml un clic est fait et que son gestionnaire d’événements s’exécute, ButtonCreatedByXaml_Click par programmation :

  1. Ajoute un nouveau bouton nommé ButtonCreatedByCode à l’arborescence d’éléments XAML déjà construit.
  2. Spécifie les propriétés du nouveau bouton, telles que le nom, le contenu et la couleur d’arrière-plan.
  3. Affecte le gestionnaire d’événements ButtonCreatedByCode_Click à ButtonCreatedByCode.
  4. Affecte le même ButtonCreatedByCode_Click gestionnaire d’événements à StackPanel1.

Quand ButtonCreatedByCode un clic est fait :

  1. L’événement Click routé est déclenché le ButtonCreatedByCode.
  2. Le ButtonCreatedByCode_Click gestionnaire d’événements auquel il est affecté ButtonCreatedByCode est déclenché.
  3. L’événement Click routé traverse l’arborescence d’éléments vers StackPanel1.
  4. Le ButtonCreatedByCode_Click gestionnaire d’événements auquel il est affecté StackPanel1 est déclenché.
  5. L’événement Click routé poursuit l’arborescence d’éléments susceptible de déclencher d’autres gestionnaires d’événements Click affectés à d’autres éléments parcourus.

Le ButtonCreatedByCode_Click gestionnaire d’événements obtient les informations suivantes sur l’événement qui l’a déclenché :

  • Objet expéditeur , qui est l’élément auquel le gestionnaire d’événements est affecté. ButtonCreatedByCode La sender première fois que le gestionnaire s’exécute et StackPanel1 la deuxième fois.
  • Objet RoutedEventArgs.Source , qui est l’élément qui a déclenché l’événement à l’origine. Dans cet exemple, la valeur Source est toujours ButtonCreatedByCode.

Remarque

Une différence clé entre un événement routé et un événement CLR est qu’un événement routé traverse l’arborescence d’éléments, recherchant des gestionnaires, tandis qu’un événement CLR ne traverse pas l’arborescence d’éléments et les gestionnaires ne peuvent joindre qu’à l’objet source qui a déclenché l’événement. Par conséquent, un événement sender routé peut être n’importe quel élément parcouru dans l’arborescence d’éléments.

Pour plus d’informations sur la création et la gestion d’événements routés, consultez Comment créer un événement routé personnalisé et gérer un événement routé.

Voir aussi