天天看點

Silverlight的事件冒泡整理

在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事件。