Comment : ajouter la gestion de classe d'un événement routé
Les événements routés peuvent être gérés par des gestionnaires de classes ou d'instances sur un nœud donné de l'itinéraire. Les gestionnaires de classes sont appelés en premier et peuvent être utilisés par des implémentations de classe pour supprimer des événements de la gestion d'instances ou pour introduire d'autres comportements spécifiques des événements dans les événements détenus par les classes de base. Cet exemple illustre deux techniques étroitement liées permettant d'implémenter des gestionnaires de classes.
Exemple
Cet exemple utilise une classe personnalisée basée sur le panneau Canvas. Le principe de base de l'application est que la classe personnalisée introduit des comportements sur ses éléments enfants, notamment l'interception des clics sur le bouton gauche de la souris et leur marquage comme gérés, avant d'appeler la classe d'élément enfant ou un gestionnaire d'instances correspondant.
La classe UIElement expose une méthode virtuelle qui permet la gestion de classe de l'événement PreviewMouseLeftButtonDown, par simple substitution de l'événement. Il s'agit de la méthode la plus simple pour implémenter la gestion de classe si cette méthode virtuelle est disponible dans la hiérarchie de la classe. Le code suivant affiche l'implémentation de OnPreviewMouseLeftButtonDown dans le "MyEditContainer" dérivé de Canvas. L'implémentation marque l'événement comme géré dans les arguments, puis ajoute du code pour fournir une modification visible de base à l'élément source.
Protected Overrides Sub OnPreviewMouseRightButtonDown(ByVal e As System.Windows.Input.MouseButtonEventArgs)
e.Handled = True 'suppress the click event and other leftmousebuttondown responders
Dim ec As MyEditContainer = CType(e.Source, MyEditContainer)
If ec.EditState Then
ec.EditState = False
Else
ec.EditState = True
End If
MyBase.OnPreviewMouseRightButtonDown(e)
End Sub
protected override void OnPreviewMouseRightButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
e.Handled = true; //suppress the click event and other leftmousebuttondown responders
MyEditContainer ec = (MyEditContainer)e.Source;
if (ec.EditState)
{ ec.EditState = false; }
else
{ ec.EditState = true; }
base.OnPreviewMouseRightButtonDown(e);
}
Si aucun élément virtuel n'est disponible dans les classes de base ou pour cette méthode particulière, la gestion de classe peut être directement ajoutée à l'aide d'une méthode utilitaire de la classe EventManager, RegisterClassHandler. Cette méthode doit être appelée uniquement dans l'initialisation statique des classes qui ajoutent la gestion de classe. Cet exemple ajoute un autre gestionnaire pour PreviewMouseLeftButtonDown ; dans ce cas, la classe inscrite correspond à la classe personnalisée. Par opposition, en cas d'utilisation d'éléments virtuels, la classe inscrite correspond réellement à la classe de base UIElement. Si les classes de base et les sous-classes inscrivent la gestion de classe, les gestionnaires de sous-classes sont appelés en premier lieu. D'après le comportement d'une application, ce gestionnaire affiche d'abord sa boîte de message puis la modification visuelle s'affiche dans le gestionnaire de la méthode virtuelle.
Shared Sub New()
EventManager.RegisterClassHandler(GetType(MyEditContainer), PreviewMouseRightButtonDownEvent, New RoutedEventHandler(AddressOf LocalOnMouseRightButtonDown))
End Sub
Friend Shared Sub LocalOnMouseRightButtonDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
MessageBox.Show("this is invoked before the On* class handler on UIElement")
'e.Handled = True //uncommenting this would cause ONLY the subclass' class handler to respond
End Sub
static MyEditContainer()
{
EventManager.RegisterClassHandler(typeof(MyEditContainer), PreviewMouseRightButtonDownEvent, new RoutedEventHandler(LocalOnMouseRightButtonDown));
}
internal static void LocalOnMouseRightButtonDown(object sender, RoutedEventArgs e)
{
MessageBox.Show("this is invoked before the On* class handler on UIElement");
//e.Handled = true; //uncommenting this would cause ONLY the subclass' class handler to respond
}
Voir aussi
Tâches
Comment : gérer un événement routé
Référence
Concepts
Marquage des événements routés comme gérés et gestion de classe