Bubbling event: MouseMove, the order in which the control events are triggered: from top to bottom
Tunneling events: Previewmousemove, triggering the order of control events: from the bottom to the top
Bubbling event: MouseMove
<border x:name= "Greenborder" background= "Green" width= "horizontalalignment=" "Right" mousemove= "GreenBorder_ MouseMove ">
<border x:name= "Redborder" background= "Red" width= "+" height= "" mousemove= "" Redborder_mousemove "></ Border>
</Border>
Background code:
Private voidLowerborder_mousemove (Objectsender, MouseEventArgs e) { if(E.leftbutton = =mousebuttonstate.pressed) {Text1. Text+="Lower Border x:"+ E.getposition ( This). X +"y:"+ E.getposition ( This). Y +"\ r \ n"; } } Private voidTopborder_mousemove (Objectsender, MouseEventArgs e) { if(E.leftbutton = =mousebuttonstate.pressed) {Text1. Text+="Top Border x:"+ E.getposition ( This). X +"y:"+ E.getposition ( This). Y +"\ r \ n"; //set Handled=true to block execution of Lowerborder_mousemove eventse.handled =true; } }
View Code
Tunnel Event: Previewmousemove
<border x:name= "Lowerborder" background= "Green" width= "horizontalalignment=" "Right" previewmousemove= " Lowerborder_previewmousemove ">
<border x:name= "Topborder" background= "Red" width= "+" height= "previewmousemove=" Topborder_ Previewmousemove "></Border>
</Border>
//perform the Lowerborder event first Private voidLowerborder_previewmousemove (Objectsender, MouseEventArgs e) { if(E.leftbutton = =mousebuttonstate.pressed) {Text1. Text+="Lower Border x:"+ E.getposition ( This). X +"y:"+ E.getposition ( This). Y +"\ r \ n"; } } //after performing the Topborder event Private voidTopborder_previewmousemove (Objectsender, MouseEventArgs e) { if(E.leftbutton = =mousebuttonstate.pressed) {Text1. Text+="Top Border x:"+ E.getposition ( This). X +"y:"+ E.getposition ( This). Y +"\ r \ n"; } }
View Code
WPF bubbling events and tunneling events