Laatst wilde ik op een button het MouseLeftButtonDown event afvangen in plaats van het standaard Click event. Dit was iets trickier dan ik dacht...
Zoals jullie wellicht weten is er in wpf een nieuw event programming model, dat onder andere gebruik maakt van routed events. Hier staat een beknopt overzicht.
Het heeft veel voordelen, maar sommige dingen worden er iets ondoorzichtiger van.
Normaliter bestaat een logisch event uit 2 echte events:
- een tunneling event (meestal met een "Preview" prefix ) dat in de visual tree omlaag gaat
- een bubbling event dat in de tree omhoog gaat
Maar bij MouseLeftButtonDown is dit dus niet zo!
Als ik het goed begrijp is er dus wel een tunneling event, in dit geval PreviewMouseLeftButtonDown, maar geen bijbehorend bubbling event.
MouseLeftButtonDown bestaat wel, maar mbv Reflector kan ik zien dat dit event wordt geregistreerd met RoutingStrategy.Direct.
Dus de Button class (en al de descendants, waaronder de Checkbox en RadioButton), slikt de MouseLeftButtonDown en verandert het min of meer in het Click event.
Conclusie: probeer PreviewMouseLeftButtonDown te gebruiken ipv MouseLeftButtonDown
Note: MouseDown zou LeftButtonDown en RightButtonDown moeten afvangen, maar werkt dus alleen met de rechtermuis knop