Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 :
- L’instruction AddHandler avec l’opérateur AddressOf, qui est également utilisé dans le modèle de gestion des événements CLR.
- Le gère le mot clé dans la définition du gestionnaire d’événements. Pour plus d’informations, consultez traitement des événements dans Visual Basic et WPF.
- Méthode UIElement.AddHandler, avec l’opérateur
AddressOfpour référencer le gestionnaire d’événements.
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 :
- Ajoute un nouveau bouton nommé
ButtonCreatedByCodeà l’arborescence d’éléments XAML déjà construit. - Spécifie les propriétés du nouveau bouton, telles que le nom, le contenu et la couleur d’arrière-plan.
- Affecte le gestionnaire d’événements
ButtonCreatedByCode_ClickàButtonCreatedByCode. - Affecte le même gestionnaire d’événements
ButtonCreatedByCode_ClickàStackPanel1.
Lorsque l'on clique sur ButtonCreatedByCode
- L’événement routé Click est déclenché sur
ButtonCreatedByCode. - Le gestionnaire d’événements
ButtonCreatedByCode_Clickaffecté àButtonCreatedByCodeest déclenché. - L'événement routé
Clicktraverse l’arborescence d’éléments jusqu’àStackPanel1. - Le gestionnaire d’événements
ButtonCreatedByCode_Clickaffecté àStackPanel1est déclenché. - L’événement routé
Clickcontinue à monter dans l'arborescence des éléments, pouvant potentiellement déclencher d’autres gestionnaires d’événementsClickassigné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
senderseraButtonCreatedByCodela première fois que le gestionnaire s’exécute etStackPanel1la deuxième fois. - Objet RoutedEventArgs.Source, qui est l’élément qui a déclenché l’événement à l’origine. Dans cet exemple, la
Sourceest toujoursButtonCreatedByCode.
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
.NET Desktop feedback