Partager via


Comment ajouter un gestionnaire d’événements à l’aide du code

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.

Conditions préalables

L’article suppose une connaissance de base des événements routés et que vous avez lu 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 :

Exemple :

L’exemple suivant utilise XAML pour définir une Button nommée ButtonCreatedByXaml et affecter la méthode ButtonCreatedByXaml_Click comme gestionnaire d’événements Click. 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 gestionnaires ButtonCreatedByXaml_Click et ButtonCreatedByCode_Click, et pour affecter le gestionnaire de ButtonCreatedByCode_Click aux éléments ButtonCreatedByCode et StackPanel1. 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

Lorsque ButtonCreatedByXaml est cliqué et que son gestionnaire d’événements s’exécute, ButtonCreatedByXaml_Click s'effectue programmatiquement :

  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 gestionnaire d’événements ButtonCreatedByCode_Click à StackPanel1.

Lorsque l'on clique sur ButtonCreatedByCode

  1. L’événement routé Click est déclenché sur ButtonCreatedByCode.
  2. Le gestionnaire d’événements ButtonCreatedByCode_Click affecté à ButtonCreatedByCode est déclenché.
  3. L'événement routé Click traverse l’arborescence d’éléments jusqu’à StackPanel1.
  4. Le gestionnaire d’événements ButtonCreatedByCode_Click affecté à StackPanel1 est déclenché.
  5. L’événement routé Click continue à monter dans l'arborescence des éléments, pouvant potentiellement déclencher d’autres gestionnaires d’événements Click assignés à d’autres éléments traversés.

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

  • L’expéditeur objet, qui est l’élément auquel le gestionnaire d’événements est affecté. Le sender sera ButtonCreatedByCode la 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 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 routé sender 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