在Silverlight中,提供了事件冒泡,使得我們可以在父節點上接收和處理來自于子節點的事件,Silverlight中的事件采用 了冒泡路由政策。在滑鼠事件中MouseLeftButtonDown 、MouseLeftButtonUp 、MouseMove三個事件都支援路由 事件,而MouseEnter、MouseLeave兩個事件不支援。
事件冒泡機制是指子對向沿着對象層次結構向上傳遞事件,比如在一個畫布中包含一個矩形,如果為矩形和畫布都定義了MouseMove事件,那麼當在矩形上移動滑鼠時,矩形會将MouseMove事件傳遞到他的父對象,那麼父對象也會觸發MouseMove事件。
下面舉一個示例。
在該圖中有兩個矩形,當滑鼠在矩形上移動時,可以看到同時也觸發了Canvas的MouseMove事件。該示例的XAML代碼如下所示。
<Canvas x:Name="parentCanvas"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="Page_Loaded"
x:Class="bubbledeventDemo.Page;assembly=ClientBin/bubbledeventDemo.dll"
Width="640"
Height="480"
MouseMove="onCanvasMouseMove"
Background="White"
>
<!--定義矩形A,并指定移動事件-->
<Rectangle
x:Name="RectA"
MouseMove="onRectMouseMove"
Width="100" Height="100" Fill="PowderBlue" />
<!--定義矩形B,并指定與矩形A相同的移動事件-->
x:Name="RectB"
MouseMove="onRectMouseMove"
Width="100" Height="100" Fill="Gold"
Canvas.Top="50" Canvas.Left="50" Opacity="0.5" />
<!--定義當滑鼠在矩形上面移動時的文本顯示-->
<TextBlock x:Name="statusTextBlock" Canvas.Top="180" />
<!--由事件冒泡機制引發畫布的MouseOver事件所顯示的文本-->
<TextBlock x:Name="canvasBlock" Canvas.Top="220" />
</Canvas>
滑鼠事件己經直接在XAML代碼中進行了指定,是以在這裡隻要直接編寫事件處理代碼即可,代碼如下所示。
//畫布滑鼠移動事件
void onCanvasMouseMove(object sender, MouseEventArgs e)
{
string msg = "x:y = " + e.GetPosition(null).X.ToString() + ", " + e.GetPosition(null).Y.ToString();
canvasBlock.Text = "Canvas: " + msg;
}
//滑鼠移動事件
void onRectMouseMove(object sender, MouseEventArgs e)
string msg = " x:y = " + e.GetPosition(null).X.ToString() + ", " + e.GetPosition(null).Y.ToString();
statusTextBlock.Text =((Rectangle)sender).Name+ msg;
代碼調用GetPosition擷取滑鼠的位置,并賦給TextBlock進行顯示。通過事件冒泡機制,當在矩形上移動滑鼠時,同時也觸發了畫布的MouseMove事件。