天天看點

WPF 基礎到企業應用系列4——WPF千年輪回1.開篇前言2.本文提綱3.Application4.Window5.Dispatcher及多線程6.類繼承結構7.WPF的邏輯樹和視覺樹8.本文總結9.系列進度(紅色标示已釋出)

     首先很高興這個系列能得到大家的關注和支援,基于對大家負責和對自己負責的态度,我會不斷努力寫好這個系列,分享自己的微薄技術和經驗,希望在幫助别人的 同時也不斷提升自己。由于這篇文章很多(現已拆分成2篇,今天這篇隻是其中之一),一共花了幾個個晚上的休息時間才完成,是以讀者花的時間長了一些,也希 望大家能夠見諒,這個系列以後會每周發三到四篇左右(主要是寫一篇差不多要花幾晚上,感覺思維比較發散),除了講WPF技術本身之外,也會講一些項目具體 開發,是以敬請關注。     本篇文章取名為WPF千年輪回隻因為兩個原因: WPF和當年Win32、WinForm等的到來頗為相似,隻是在功能和體驗上上進行了提高,是以這是微軟産品上的一個輪回; WPF的學習過程和其他技術一樣,譬如ASP.NET,我們在學習的時候會先要了解Asp.Net構架(Http請求處理流程)、 Pipeline、HttpHandler 和 HttpModule 等内容,這和WPF的Application生命周期相對應,再如WPF的Window生命周期可以和ASP.NET的頁面生命周期相對應等。當然你也可 以拿WinForm或者其他技術來舉例,這裡這是闡述觀點。 在前三篇文章中我們對WPF有了一個比較全面的認識,并且也通過一個基本的例子對比了WPF和之前的WinForm程式的差別和聯系。那麼在本篇文 章當中,除了講一些理論知識外,更多的是用實際的代碼來驗證這些理論。
· 1.開篇前言 · 2.本文提綱 · 3.Application · 4.Window · 5.Dispatcher及多線程 · 6.類繼承結構 · 7.WPF的邏輯樹和視覺樹 · 8.本文總結 . 9.系列進度

<b>二.建立WPF應用程式</b> 建立WPF應用程式有兩種方式: 1、Visual Studio和Expression Blend預設的方式,使用App.xaml檔案定義啟動應用程式     App.xaml檔案的内容大緻如下所示:

2、可以自已定義類,定義Main方法實作對WPF應用程式的啟動     在項目中添加一個類,類的代碼如下,在項目選項中,設定此類為啟動項。

<b>三、Application應用程式關閉</b>     OnLastWindowClose(預設值): 最後一個窗體關閉或調用Application對象的Shutdown() 方法時,應用程式關閉。 OnMainWindowClose 啟動窗體關閉或調用Application對象的Shutdown()方法時,應用程式關 閉。(和C#的Windows應用程式的關閉模式比較類似) OnExplicitShutdown 隻有在調用Application對象的Shutdown()方法時,應用程式才會關閉。   對關閉選項更改的時候,可以直接在App.xaml中更改:

<b>四、Application對象的事件</b> 名稱 描述 Activated 當應用程式成為前台應用程式時發生,即擷取焦點。 Deactivated 當應用程式停止作為前台應用程式時發生,即失去焦點。 DispatcherUnhandledException 在異常由應用程式引發但未進行處理時發生。 Exit 正好在應用程式關閉之前發生,且無法取消。 FragmentNavigation 當應用程式中的導航器開始導航至某個内容片斷時發生,如果所需片段位于目前内容中,則導航會立即發生;或者,如果所需片段位于不同 内容中,則導航會在加載了源 XAML 内容之後發生。 LoadCompleted 在已經加載、分析并開始呈現應用程式中的導航器導航到的内容時發生。 Navigated 在已經找到應用程式中的導航器要導航到的内容時發生,盡管此時該内容可能尚未完成加載。 Navigating 在應用程式中的導航器請求新導航時發生。 NavigationFailed 在應用程式中的導航器在導航到所請求内容時出現錯誤的情況下發生。 NavigationProgress 在由應用程式中的導航器管理的下載下傳過程中定期發生,以提供導航進度資訊。 NavigationStopped 在調用應用程式中的導航器的 StopLoading 方法時發生,或者當導航器在目前導航正在進行期間請求了一個新導航時發生(沒大用到)。 SessionEnding 在使用者通過登出或關閉作業系統而結束 Windows 會話時發生。 Startup 在調用 Application 對象的 Run 方法時發生。 應用程式的事件處理可以: 1、在App.xaml中做事件的綁定,在App.xaml.cs檔案中添加事件的處理方法     在App.xaml檔案中:

    在App.xaml.cs檔案中:

2、在自定義的類中可以做正常的C#的事件綁定:

<b>一、窗體類基本概念</b> 對于WPF應用程式,在Visual Studio和Expression Blend中,自定義的窗體均繼承System.Windows.Window類.大家都可能聽說過或者看過Applications = Code + Markup: A Guide to the Microsoft Windows Presentation Foundation這本書,它裡面就是用XAML和背景代碼兩種形式來實作同一個功能,那麼我們這裡定義的窗體也由兩部分組成: 1、 XAML檔案,在這裡面通常全部寫UI的東西(希望大家還記得這兩幅圖)

<a href="http://images.cnblogs.com/cnblogs_com/zenghongliang/WindowsLiveWriter/3cfdd94adeea_E606/7-4-2010%203-08-26%20PM_2.png"></a>

也可以将背景代碼放在XAML檔案中,上面的例子可以改寫為:

WPF窗體的詳細的屬性、方法、事件請參考MSDN,有很多的屬性、方法、事件與Windows應用程式中 System.Windows.Forms.Form類頗為相似,其中常用的一些屬性、方法、事件有: 窗體邊框模式(WindowStyle屬性)和是否允許更改窗體大小(ResizeMode屬性) 。 窗體啟動位置(WindowStartupLocation屬性)和啟動狀态(WindowState屬性) 等。 窗體标題(Title屬性)及圖示 。 是否顯示在工作列(ShowInTaskbar) 始終在最前(TopMost屬性)  

提到這個UI和背景線程互動這個問題,大家都可能在WinForm中遇到過,記得幾年前我參加一個外資企業的面試,公司的其中一道題就是說在 WinForm 中如何使用背景線程來操作UI,是以對這個問題比較記憶猶新。 WPF線程配置設定系統提供一個Dispatcher屬性、VerifyAccess  和 CheckAccess 方法來操作線程。線程配置設定系統位于所有 WPF 類中基類,大部分WPF 元素都派生于此類,如下圖的Dispatcher類: <a href="http://images.cnblogs.com/cnblogs_com/zenghongliang/WindowsLiveWriter/WPF4WPF_133B7/image_18.png"></a> WPF 應用程式啟動後,會有兩個線程: 一個是用來處理UI呈現(處理UI的請求,比如輸入和展現等操作)。 一個用來管理 UI的 (對UI元素及整個UI進行管理)。 與 Dispatcher 排程對象想對應的就是 <b>DispatcherObject</b>,在 WPF 中絕大部分控件都繼承自 DispatcherObject,甚至包括 Application。這些繼承自 DispatcherObject 的對象具有線程關聯特征,也就意味着隻有建立這些對象執行個體,且包含了 Dispatcher 的線程(通常指預設 UI 線程)才能直接對其進行更新操作。 當我們嘗試從一個非 UI 線程更新一個UI元素,會看到如下的異常錯誤。   <b>XAML代碼</b>:

如果在其他工程或者類中,我們可以用 Application.Current.Dispatcher.Invoke方法來完成同樣的操作,它們都指向 UI Thread Dispatcher這個唯一的對象。 Dispatcher 同時還支援 BeginInvoke 異步調用,如下代碼:

關于Dispatcher和WPF多線程, 還有很多要講,由于篇幅有限且精力有限,我這裡隻講一些我們最常見的應用,同時包括Freezable 的處理等問題,大家可以查閱MSDN或者查閱國外相關的專題。

在WPF中常用的的控件類繼承結構如下圖所示(圖中圓圈的表示抽象類,方框的表示實體類): System.Object 類:大家都知道在.Net中所有類型的根類型,在圖中沒有畫出來,DispatcherObject 就繼承于它,是以它是整個應用系統的基類。 System.Windows.Threading.DispatcherObject 類:WPF 中的絕大多數對象是從 DispatcherObject 派生的,它提供了用于處理并發和線程的基本構造。WPF 是基于排程程式實作的消息系統。 System.Windows.DependencyObject類:WPF基本所有的控件都實作了依賴屬性,它表示一個參與依賴項屬性系統的對 象。 System.Windows.Media.Visual類:為 WPF 中的呈現提供支援,其中包括命中測試、坐标轉換和邊界框計算等。 System.Windows.UIElement 類:UIElement 是 WPF 核心級實作的基類,該類建立在 Windows Presentation Foundation (WPF) 元素和基本表示特征基礎上。 System.Windows.FrameworkElement類:為 Windows Presentation Foundation (WPF) 元素提供 WPF 架構級屬性集、事件集和方法集。此類表示附帶的 WPF 架構級實作,它是基于由UIElement定義的 WPF 核心級 API 建構的。 System.Windows.Controls.Control 類:表示 使用者界面 (UI) 元素的基類,這些元素使用 ControlTemplate 來定義其外觀。 System.Windows.Controls.ContentControl類:表示包含單項内容的控件。 System.Windows.Controls.ItemsControl 類:表示一個可用于呈現項的集合的控件。 System.Windows.Controls.Panel類:為所有 Panel 元素(布局)提供基類。使用 Panel 元素在 Windows Presentation Foundation (WPF) 應用程式中放置和排列子對象。 System.Windows.Sharps.Sharp類:為 Ellipse、Polygon 和 Rectangle 之類的形狀元素提供基類。 除了上面的圖以外,還有幾個命名空間也很重要,如下: System.Windows.Controls.Decorator 類:提供在單個子元素(如 Border 或 Viewbox)上或周圍應用效果的元素的基類。 System.Windows.Controls.Image 類:表示顯示圖像的控件。 System.Windows.Controls.MediaElement類:表示包含音頻和 /或視訊的控件。
關于這部分的内容講起來就比較多了,正如上次大家的留言裡說的一樣,這個内容如果拉開來講肯定就要開幾個篇幅,是以我們今天主要以講清楚概念為重 點,先看下面的一個XAML代碼的例子:

上面這個UI非常的簡單,Window是一個根結點,它有一個子結點StackPanel,StackPanel有一個子結點Label。注意 Label下還有一個子結點string(LabelText),它同時也是一個葉子結點。這就構成了視窗的一個邏輯樹。邏輯樹始終存在于WPF的UI 中,不管UI是用XAML編寫還是用代碼編寫。WPF的每個方面(屬性、事件、資源等等)都是依賴于邏輯樹的。 視覺樹基本上是邏輯樹的一種擴充。邏輯樹的每個結點都被分解為它們的核心視覺元件。邏輯樹的結點對我們來說是不可見的。而視覺樹不同,它暴露了視覺 的實作細節。下面是Visual Tree結構就表示了上面四行XAML代碼的視覺樹結構(下面這幅圖檔來源于WPF揭秘):

本篇主要對Application、window、多線程、類繼承結構、邏輯樹與可視樹等的理論和實際Demo進行了探讨,通過這一篇文章,我們可 以大概了解WPF在這些元素上的處理,同時也給我後面的内容奠定了基礎,後面會逐漸牽涉到實際的一些案例和新的概念,是以如果有不熟悉且對這個專題感興趣 的朋友可以仔細看一下這篇文章,在文章後面也會把本文用到的代碼附加上去,大家可以下載下傳下來進行測試。
<a href="http://www.cnblogs.com/zenghongliang/archive/2010/07/06/1771831.html">· 2. WPF 基礎到企業應用系列2——WPF前世今生</a> <a href="http://www.cnblogs.com/zenghongliang/archive/2010/07/09/1774059.html">· 3. WPF 基礎到企業應用系列3——WPF開發漫談</a> <a href="http://www.cnblogs.com/zenghongliang/archive/2010/07/14/1776916.html">· 4. WPF 基礎到企業應用系列4——WPF千年輪回</a> · 5. 使用面闆做布局(幾種布局控件的XAML及CS代碼,綜合布局等) · 6. 依賴屬性、附加屬性(基本、繼承、中繼資料) · 7. 路由事件、附加事件 · 8. 指令 · 9. WPF控件分類介紹與使用技巧(ContentControl、HeaderedContentControl…… Decorator) · 10. 尺寸縮放、定位與變換元素 · 11. 資源 · 12. 資料綁定(基本、值轉換、驗證、集合的篩選、排序、分組、主從、資料提供者) · 13. 樣式 · 14. 模闆 · 15. 多語言、皮膚和主題 · 16. 2D圖形 · 17. 3D圖形 · 18. 動畫(幾種動畫的應用) · 19. 音頻、視訊、語音 · 20. 文檔、列印、報表 · 21. 使用者控件和自定義控件 · 22. Win32、Windows Form以及ActiveX之間的互用性 · 23. 建構并部署應用程式(ClickOnce部署、微軟setup /InstallShield+自動更新元件) · 24. WPF的模式講解及執行個體(MVC Demo) · 25. WPF的模式講解及執行個體(MVP Demo) · 26. WPF的模式講解及執行個體(MVVM Demo) · 27. 性能優化(WPF項目的瓶頸) · 28.一個完整WPF項目(普通架構版) · 39. 一個完整WPF項目(MVVM架構版) · 30. WPF 4.0新功能 本文轉自KnightsWarrior51CTO部落格,原文連結: http://blog.51cto.com/knightswarrior/349169  ,如需轉載請自行聯系原作者

繼續閱讀