歡迎您光臨本站 註冊首頁

Silverlight系列-5 捕獲路由事件

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

Silverlight系列-5 捕獲路由事件

Silverlight中事件的處理方式有時會令人費解。其實Silverlight中有兩種事件,它們分別是「直接事件」和「路由事件」。

所謂「直接事件」其實就是我們在winform,vb6,mfc等等中使用的事件模型,相信大家已經很熟悉了,MediaElement的MediaEnded事件就是這種類型的事件。

而「路由事件」是從WPF發展到Silverlight中的。路由事件沿著可視化樹向上冒泡,它總是從嵌套中的最深層元素開始冒泡至嵌套最淺的元素。例如MouseLeftButtonUp事件先從滑鼠直接點擊的元素上觸發然後才到其父元素(順著可視化樹繼續上行)。

從路由事件發生后,任意阻止冒泡的操作都可被路由事件沿途的控制項捕獲並通知路由事件。在一些應用場景中,某些標準控制項需要捕獲所需的路由事件,比如一個Button捕獲MouseLeftButtonUp路由事件。不過我們要如何才能得知事件是否已經被捕獲呢?

答案是UIElement中的AddHandler方法

比如我們有如下XAML:

<StackPanel x:Name="LayoutRoot"
        Background="White">
    <Button Height="25"
      Width="100"
      Content="點我啊!"
      x:Name="clickButton"/>
    <Button Height="25"
      Width="100"
      Content="AddHandler"
      x:Name="addButton" />
</StackPanel>當我們點擊clickButton按鈕時LayoutRoot對應的MouseLeftButtonUp事件並不會觸發,而當我們點擊clickButton按鈕外的其他區域時,LayoutRoot的MouseLeftButtonUp又被觸發了。

如果我們要讓clickButton捕獲LayoutRoot上的MouseLeftButtonUp事件,那就需要使用UIElement.AddHandler()方法。

該方法的簽名如下:

public void AddHandler(RoutedEvent routedEvent,  Delegate handler, bool handledEventsToo);
一個確切的路由事件 routedEvent
一個具有正確對應類型的委託 handler
以及一個用來確定捕獲指定事件時是否發出通知的的布爾值handledEventsToo
於是在我們為addButton的Click事件增加如下代碼

LayoutRoot.AddHandler(
  UIElement.MouseLeftButtonUpEvent,
  new MouseButtonEventHandler((o, args) => {
      MessageBox.Show("我是路由事件,我被觸發了,oh yeah!");
  }), true);如此,我們在點擊clickButton的時候頁一樣可以捕獲到MouseLeftButtonUp事件了。

全部的後台代碼如下:

        public MainPage() {
            InitializeComponent();
            clickButton.Click += new RoutedEventHandler(clickButton_Click);
            addButton.Click += new RoutedEventHandler(addButton_Click);
        }

        void addButton_Click(object sender, RoutedEventArgs e) {

            LayoutRoot.AddHandler(
              UIElement.MouseLeftButtonUpEvent,
              new MouseButtonEventHandler((o, args) => {
                  MessageBox.Show("我是路由事件,我被觸發了,oh yeah!");
              }), true);
        }

        void clickButton_Click(object sender, RoutedEventArgs e) {
            MessageBox.Show("我是按鈕,我被點了。");
        }

[火星人 ] Silverlight系列-5 捕獲路由事件已經有506次圍觀

http://coctec.com/docs/service/show-post-2632.html