XAML實例教程系列 - 事件(Event)


  

Events,中文稱為事件,是Windows消息機制中重要概念之一,也是最常見的人機交互手段之一。

XAML和其他開發語言類似,具有事件機能,幫助應用管理用戶輸入,執行不同的行為。 根據用戶不同的操作,執行不同的業務邏輯代碼。

例如,用戶輸入日期,點擊按鈕確認,移動鼠標等操作都可以使用事件進行管理。 

而在Windows 8和Silverlight應用開發中,事件常常被用於控制更改通知操作,例如,使用ListBox綁定一個依賴屬性,當該屬性值修改時,可以通過事件自動通知客戶端,並更新顯示屬性值。

本篇,將詳細介紹XAML的事件處理。 

 

快速理解Xaml事件

在傳統應用中,一個對象激活一個事件被稱為Event Sender(事件發送者),而事件所影響的對象則稱為Event Receiver(事件接收者)。 例如,在Windows Forms應用開發中,對象事件的sender和receiver永遠是同一個對象。簡單的理解,如果你點擊一個按鈕對象,這個按鈕對象激活Click事件,同時該對象后台代碼將接收事件,並執行相關邏輯代碼。

而XAML中不僅繼承傳統事件處理方式,並且引入依賴屬性系統,同時還引入一個增強型事件處理系統 - Routed Event(路由事件)。路由事件和傳統事件的不同是, 路由事件允許一個對象激活事件后,既是一個Event Sender(事件發送者),同時擁有一個或者多個Event Receiver(事件接收者)。

 

Xaml事件基礎語法

 

事件在Xaml中基礎語法如下: 

 

<元素對象 事件名稱=”事件處理”/>


例如:使用按鈕控件的Click事件,響應按鈕點擊效果,代碼如下:

<Button Click=”Button_Click”/>

 

其中Button_Click連接后台代碼中的同名事件處理程序:
Private void Button_Click(object sender,  RoutedEventArgs e)
{

    事件處理 


在實際項目開發中,Visual Studio 的Xaml語法解析器為開發人員提供了智能感知功能,通過該功能可以在Xaml中方便的調用指定事件,而Visual Studio將為對應事件自動生成事件處理函數后台代碼。 

 

XAML路由事件(Routed Event)處理方式

前幾篇實例教程曾介紹過,XAML對象元素是基於層次型結構的可擴展應用程序標記語言,當XAML應用運行時,頁面內的控件對象將按照層次結構順序進行初始化,最終生成一個對象樹結構。在Windows 8應用中,最終生成一個根為Window對象的對象樹,而在Silverlight,將生成一個根為UserControl對象的對象樹。


XAML的路由事件(Routed Events)處理方式可分為三種:

1. 冒泡事件(Bubbling Event), 該事件是最常見的事件處理方式。該事件表示對象激活事件后,將沿着對象樹由下至上,由子到父的方式傳播擴散,直到被處理或者到達對應的根對象元素,或者該事件對應得RoutedEventArgs.Handled = true時,完成處理。在傳播擴散中,所有涉及的元素對象都可以被該事件進行控制。該事件可被Windows 8,Silverlight支持。

2. 隧道事件(Tunneling Event), 該事件處理方式和冒泡事件相反,對象激活事件后,將從根對象元素傳播擴散到激活事件的子對象,或者該事件對應得RoutedEventArgs.Handled = true時,完成處理。該事件僅Windows 8支持。

3. 直接路由事件(Direct Routing Event), 該事件沒有向上或者向下傳播擴散,僅作用於當前激活事件的對象上。該事件可被Windows 8, Silverlight支持。


 

在Windows 8 Metro應用中,測試冒泡事件實例。

創建三個不同的布局控件Grid,Canvas,StackPanel,通過PointerPressed事件查看事件激活順序。

 

復制代碼
 1      < Grid  x:Name ="LayoutRoot"  Background =" {StaticResource ApplicationPageBackgroundThemeBrush} "  PointerPressed ="LayoutRoot_PointerPressed_1" >
 2          < TextBlock  Text ="Grid控件測試"  FontWeight ="Bold"  Margin ="5" />
 3          < Canvas  Height ="200"  Width ="300"  Background ="Blue"  PointerPressed ="Canvas_PointerPressed_1" >         
 4              < TextBlock  Text ="Canvas控件測試"  FontWeight ="Bold"  Foreground ="Yellow"  Margin ="5" />
 5              < StackPanel  Height ="150"  Width ="250"  Background ="Green"  Canvas.Top ="25"  Canvas.Left ="25"  PointerPressed ="StackPanel_PointerPressed_1" >
 6                  < TextBlock  Text ="StackPanel控件測試"  FontWeight ="Bold"  Margin ="5" />
 7                  < TextBlock  Text ="鼠標左鍵點擊,冒泡事件順序:"  FontWeight ="Bold"  Margin ="5" />
 8                  < TextBlock  x:Name ="eventOrder"  Width ="250"  TextWrapping ="Wrap" />
 9              </ StackPanel >            
10          </ Canvas >      
11      </ Grid >
復制代碼

應用以上XAML代碼后,則會生成以下對象樹:

 

 

后台代碼如下:

復制代碼
         private  void Canvas_PointerPressed_1( object sender, PointerRoutedEventArgs e)
        {
            eventOrder.Text +=  "  Canvas - ";
        }

         private  void LayoutRoot_PointerPressed_1( object sender, PointerRoutedEventArgs e)
        {
            eventOrder.Text +=  "  Grid;  ";
            e.Handled =  true;
        }

         private  void StackPanel_PointerPressed_1( object sender, PointerRoutedEventArgs e)
        {
            eventOrder.Text +=  "  StackPanel -  ";
        }
復制代碼

 

 Windows 8測試效果:


 

添加和刪除事件處理器

從上例可以看到,XAML添加事件非常簡單。下面通過實例介紹如何在后台代碼添加XAML對象事件。

  < StackPanel   Height ="150"  Width ="250"  Background ="Red"  Grid.Row ="1"  Orientation ="Vertical"  PointerPressed ="StackPanel_PointerPressed_2" >
            < Button  x:Name ="btOK"  Content  ="提交"  Margin ="5"  Width ="100"  />
            < TextBlock  x:Name ="eventContent"  Width ="250"  TextWrapping ="Wrap"  Foreground ="Yellow" />
        </ StackPanel >

上面代碼,添加一個按鈕控件和文本顯示框,其中按鈕控件沒有聲明Click事件,使用C#后台代碼聲明事件委托操作符是“+=”。其格式如下:

 

btOK.Click +=  new RoutedEventHandler(btOK_Click_1);

通常來說,建議將事件委托聲明放在根對象的Loaded事件中,也可以將事件委托代碼放在構造函數中。

刪除一個事件委托,則使用“-=”操作符,其格式如下:

btOK.Click -=  new RoutedEventHandler(btOK_Click_1);


運行后,點擊按鈕,則會激活事件:

 

 

XAML在Windows 8 Metro中的新特性

微軟Windows 8系統不僅適用於PC,而且適用於平板電腦。針對平板電腦的特性,XAML也增加了新的事件處理特性。主要體現在:

1. 繼承傳統事件處理機制,XAML將控制按鈕點擊事件;

2. 監聽列表控件選項事件;

3. 監聽應用激活和暫停事件; 

4. 觸控事件處理,包括指針處理,手勢處理以及控制操作事件等;

 

 

 

常用觸控事件列表: 

Pointers:

Pressed

Released

Moved

Canceled

CaptureLost

Entered

Exited 

 

Gestures:

Tapped

RightTapped

Holding

DoubleTapped

 

Manipulation:

Starting

Started

Delta

Completed

InteriaStarting 

 

實例代碼如下: 

 

 

這篇介紹到這里,歡迎留言討論。

源代碼下載(VS2012 RC)

 

XAML實例教程系列

 
 

歡迎大家留言交流,或者加入QQ群交流學習:

22308706(一群) 超級群500人 
37891947(二群) 超級群500人 
100844510(三群) 高級群200人 
32679922(四群) 超級群500人 
23413513(五群) 高級群200人 
32679955(六群) 超級群500人 
88585140(八群) 超級群500人 
128043302(九群 企業應用開發推薦群) 高級群200人 
101364438(十群) 超級群500人 

68435160(十一群 企業應用開發推薦群)超級群500人 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM