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.
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.
- Mot clé Handles 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 :
- 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
ButtonCreatedByCode_Click
gestionnaire d’événements àStackPanel1
.
Quand ButtonCreatedByCode
un clic est fait :
- L’événement Click routé est déclenché le
ButtonCreatedByCode
. - Le
ButtonCreatedByCode_Click
gestionnaire d’événements auquel il est affectéButtonCreatedByCode
est déclenché. - L’événement
Click
routé traverse l’arborescence d’éléments versStackPanel1
. - Le
ButtonCreatedByCode_Click
gestionnaire d’événements auquel il est affectéStackPanel1
est déclenché. - L’événement
Click
routé poursuit l’arborescence d’éléments susceptible de déclencher d’autres gestionnaires d’événementsClick
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
Lasender
première fois que le gestionnaire s’exécute etStackPanel1
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 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 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
.NET Desktop feedback