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事件,響應按鈕點擊效果,代碼如下:
事件處理
}
在實際項目開發中,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事件查看事件激活順序。
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代碼后,則會生成以下對象樹:
后台代碼如下:
{
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對象事件。
< Button x:Name ="btOK" Content ="提交" Margin ="5" Width ="100" />
< TextBlock x:Name ="eventContent" Width ="250" TextWrapping ="Wrap" Foreground ="Yellow" />
</ StackPanel >
上面代碼,添加一個按鈕控件和文本顯示框,其中按鈕控件沒有聲明Click事件,使用C#后台代碼聲明事件委托操作符是“+=”。其格式如下:
通常來說,建議將事件委托聲明放在根對象的Loaded事件中,也可以將事件委托代碼放在構造函數中。
刪除一個事件委托,則使用“-=”操作符,其格式如下:
運行后,點擊按鈕,則會激活事件:
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人