mai
2007
Si vous développez avec WPF, vous avez sans doute remarqué que les évènements (prenons MouseDown par exemple) était doublé : MouseDown et PreviewMouseDown. Pourquoi ?
En fait le principe est assez simple :
En WPF, une chose très importante est la définission arborescente des contrôles dans un container.
Si un évènement MouseDown est déclenché sur un controle, l’évènement sera récupérable par le contrôle puis par chacun de ces parents.
Inversement, si l’évènement PreviewMouseDown est déclenché, il sera récupérable en dernier par le contrôle ayant déclenché l’évènement, après tous ces parents. Par convention, on utilisera systèmatiquement le préfixe pour désigner ce type d’évènement.
Dans un cas comme dans l’autre, si vous voulez stoppez la propagation de l’évènement, vous devez utiliser
e.Handled = true
En WPF, les évènements ont une « RoutingStrategy ». Dans le premier cas, on parlera de RoutingStrategy de type Bubble et dans le deuxième cas de type tunnel. Enfin, il existe un dernier cas (celui des WinForms classiques) pour lequel on parlera de RoutingStrategry de type Direct (ie : sans propagation).
J’ai volontairement parlé de RoutingStrategy plutôt que de stratégie de routage car en WPF, les EventArgs héritent de RoutedEventArgs qui a une propriété (RoutedEvent) de type RoutedEvent qui elle-même a une propriété RoutingStrategy de type RoutingStrategy (un enum avec les trois valeurs : Tunnel, Bubble et Direct).
Voir cette discussion aussi où plusieurs solutions sont proposées : http://www.developpez.net/forums/d721361/dotnet/general-dotnet/wpf/combobox-tabitem-impossible-dinitialiser-combobox-selectedindex/
Cordialement,
Arnaud DANEELS
Exact, mea culpa. C’est corrigé.
Merci.
Je ne sais pas pourquoi j’ai écris ça. D’autant que c’est complètement absurde de propager l’évènement vers les contrôles enfants.
En complément, je dirais que si on est abonné à la fois à MouseDown et PreviewMouseDown, c’est le PreviewMouseDown qui est effectué en premier.
Salut Matthieu,
Il me semble que les RoutedEvent de WPF, qu’ils soient de type bubble ou tunnel ne sont interceptables que par les contrôles parents (et non pas les enfants). La différence est: qui reçoit l’évènement en premier ? Pour les bubbles, c’est le control en premiers puis les parents. Pour les tunnel, on part de la racine des controles jusqu’au control en question.
A plus,
Mitsu