Partager via


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

EventManager

Concepts

Marquage des événements routés comme gérés et gestion de classe

Vue d'ensemble des événements routés