前兩章學習了WPF事件的工做原理,如今分析一下在代碼中能夠處理的各種事件。儘管每一個元素都提供了許多事件,但最重要的事件一般包括如下5類:佈局
1、生命週期事件學習
當首次建立以及釋放全部元素時都會引起事件,可以使用這些事件初始化窗口。表1-1列出了這些事件,他們是在FrameworkElement類中定義的。對象
表1-1 全部元素的生命週期事件blog
爲了弄清Initialized事件和Loaded事件之間的關係,分析一下呈現過程是有幫助的。FrameworkElement類實現了ISupportInitialize接口,該接口提供了兩個用於控制初始化過程的方法。第一個方法是BeginInit(),在實例化元素後當即調用該方法。調用BeginInit()方法後,XAML解析器設置全部元素的屬性(並添加內容)。第二個方法是EndInit(),完成初始化後,將調用該方法,此時引起Initialized事件。繼承
當建立窗口時,會自下而上地初始化每一個元素分支。這意味着,位於深層的嵌套元素在他們的容器以前被初始化。當引起初始化事件時,可確保元素樹中當前元素如下的元素已經所有完成了初始化。可是,包含當前元素的元素可能尚未初始化,而且不能假定窗口的任何其餘部分已經初始化。接口
在每一個元素都完成初始化後,還須要在他們的容器中進行佈局、應用樣式。若是須要的話,還會綁定到數據源。當引起窗口的Initialized事件後,就能夠進入下一階段了。生命週期
一旦完成初始化過程,就會引起Loaded事件。Loaded事件和Initialized事件的發生過程相反——換句話說,包含其餘全部元素的窗口首先引起Loaded事件,而後纔是更深層的嵌套元素。爲全部元素都引起了Loaded事件後,窗口就變得可見了,而且元素都已被呈現。事件
窗口還有它本身更特殊的生命週期事件,表1-2列出了這些事件。it
表1-2 Windows類的生命週期事件容器
若是隻對執行控件的第一次初始化感興趣,完成這項任務的最好時機是在觸發Loaded事件時。一般可在同一位置進行全部初始化,這個位置通常是Window.Load事件的事件處理程序。
2、輸入事件
輸入事件是當用戶使用某些種類的外設硬件進行交互時發生的事件,例如鼠標、鍵盤、手寫筆或多點觸控屏。輸入事件可經過繼承自InputEventArgs的自定義事件參數類傳遞額外的信息。以下圖所示,顯示了繼承層次。
圖 輸入事件的EventArgs類
InputEventArgs類只增長了兩個屬性:Timestamp和Device。Timestamp屬性提供了一個整數,指示事件什麼時候發生的毫秒數(它所表明的實際事件並不重要,但可比較不一樣的時間戳值以肯定哪一個事件先發生。事件戳值大的事件是在更近發生的)。Device屬性返回一個對象,該對象提供與觸發事件的設備相關的更多信息,設備能夠是鼠標、鍵盤或手寫筆。這三種可能的設備由不一樣的類表示,全部這些類都繼承自抽象類System.Windows.Input.InputDevice.
接下來章節將進一步分析在WPF應用程序中如何處理鼠標、鍵盤以及多點觸控動做。