Le RoutedEventHandler qui remplace l’EventHandler de WinForm dans WPF et bien souvent un grand incompris. Dans le cadre de son fonctionnement par défaut, si un event se produit sur un control, le control va traiter cet event et déclencher l'e même event sur son parent. C’est ce qui est appelé le Bubbling (voir la msdn pour plus d’informations).
Mais ce que l’on oublie vite c’est qu’il est possible de stopper la propagation d’un event si a déjà fait le traitement qui nous semblait adéquat. Ceci ce fait via le propriété Handled du RoutedEventHandler (par défaut la variable e de l’event).
Donc en pratique, pour une Window dont le drag and drop est actif si j’abonne les event Drop de ma Window et d’un de ses Controls à deux méthodes, je peux dans la méthode du controls interdire la remonté de l’event Drop à ma Window.
XAML
<Window x:Class="MyDock.MyDockWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" AllowDrop="True" DragOver="Window_DragOver" Drop="Window_Drop" Background="Transparent"> <Grid> <Image Drop="Drop="Control_Drop" /> </Grid> </Window>
Vb
''' <summary> ''' Drop sur la window ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Window_Drop(ByVal sender As Object,ByVal e As DragEventArgs) ' Traitement à faire pour un Dop sur ma Window End Sub ''' <summary> ''' Drop sur le control ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Control_Drop(ByVal sender As Object, ByVal e As DragEventArgs) ' Traitement à faire pour un Drop sur mon Control If (“test si le traitement est ok” “traitement ok l'event ne doit pas remonter”) Then e.Handled = True End If End Sub
C#
/// <summary> /// Drop sur la window /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Window_Drop(object sender, DragEventArgs e) { // Traitement à faire pour un Dop sur ma Window } /// <summary> /// Drop sur le control /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Control_Drop(object sender, DragEventArgs e) { // Traitement à faire pour un Drop sur mon Control if( “test si le traitement est ok” “traitement ok l'event ne doit pas remonter”) { e.Handled = true; } }