爲你解惑之WPF經典9問詳解

  第0問:可否簡單介紹一下本文的結構?算法

  本文解答了關於WPF的9個最多見的問題。從某種意義上講,這兩種技術是相互關聯的:它們都是關於界面表現的技術,更進一步的,Silverlight是基於WPF的,是它的一個子集。不只從理論上介紹了這兩種技術,同時還提供了一些小的例子供你們參考。瀏覽器

  第1問:咱們已經有了GDI、GDI+和DirectX,爲何咱們還須要WPF呢?架構


圖1 從User32到WPF的發展歷程併發

  首先,讓咱們來回顧一下微軟的各類界面顯示技術:

  User32:它提供了最基本的Windows界面,包括扌安鈕,編輯框和其餘UI元素。可是,User32缺少的是圖形圖像的繪製功能,沒法對屏幕實現自定義的繪製。框架

  GDI (Graphics device interface):- 爲了提供圖形圖像的繪製功能,微軟在User32的基礎上引入了GDI。GDI不只提供了圖形圖像的繪製功能,同時還對硬件顯示進行了更高層次的抽象。換句話說,它將硬件的複雜性封裝在了GDI API中,用戶使用起來更加方便。函數

  GDI+:顧名思義,GDI+是做爲GDI的擴展而被引入到Windows中的。它提供了不少GDI所沒有的擴展功能,例如對JPG和PNG圖像格式支持,漸變陰影和抗鋸齒等。不管是GDI仍是GDI+,它們最大的侷限就是不支持硬件加速,同時沒法展示動畫和3D圖像。佈局

  提示:所謂硬件加速,就是使用硬件來執行某些功能,以替代使用軟件在CPU中執行的某些功能,由於直接使用硬件,這樣能夠顯著地加快圖形圖像處理的速度。性能

  DirectX :正如咱們在上面所分析的那樣,GDI及其擴展GDI+的一個最大問題就是不支持硬件加速和動畫。這對於遊戲開發者來講,是沒法接受的。爲了解決這個問題,微軟開發了DirectX。DirectX可以很好的利用硬件加速,可以支持3D,全綵圖像,流媒體等等,很是適合遊戲工業等對圖形圖像處理要求比較高的領域。字體

  WPF:微軟已經有了這麼多套關於顯示技術的API,爲何還要畫蛇添足,建立另一套顯示技術的API呢?經過對硬件加速的支持,DirectX已經有了不少很是棒的特性。微軟想利用支持硬件加速的DirectX技術來開發UI元素,好比文本框,扌安鈕,網格等等,因此他們又在DirectX的基礎上開發了WPF。由於WPF是在DirectX的基礎上實現的,因此你不只能夠利用WPF建立簡單的UI元素,還能夠更進一步,開發特殊的UI元素,例如網格(Grid),流文檔(FlowDocument)和橢圓(Ellipse)等。動畫

  更進一步地,你還能夠利用WPF建立動畫。若是你在尋找用於建立輕量級動畫(不是遊戲中所使用的那種複雜三維動畫)的技術方案,WPF將是一個不錯的選擇。你可使用被稱爲XAML的XML文件來表現WPF。 


圖2 WPF和DirectX的關係

  簡單的講,WPF就是DirectX之上的一層包裝。因此,咱們能夠這樣定義WPF:

  WPF是一套用於簡便地構建動態用戶界面的類的集合。這些類包括了一套新的界面控件。其中有些控件跟舊有的UI元素是類似的,例如標籤,文本框和扌安鈕等,而另一些控件則是全新的,例如,網格(Grid),流文檔(FlowDocument)和橢圓(Ellipse)等。

 

  第2問:WPF中的硬件加速是如何工做的?

  正如咱們在前文所介紹的那樣,簡而言之,硬件加速就是利用硬件來替代軟件算法以充分利用硬件所固有的快速運算的特性。
WPF從如下三個層次上來利用硬件加速的特性:
 


圖3 WPF硬件加速的三個層次

  WPF API首先檢測你的硬件系統所支持的硬件加速的等級,好比顯卡的顯存大小,像素深度等等。基於你所使用的硬件,WPF將從如下三種渲染模式中的選擇一種做爲其渲染模式:

  •第0級
  若是你的顯卡不支持硬件加速,WPF將採用第0級渲染模式。也就是說它將使用軟件加速。這至關於使用低於7.0版本的DirectX。
  •第1級
  若是你的顯卡部分地支持硬件加速,那麼WPF將採用第1級渲染模式。這至關於使用版本號在7.0到9.0之間的DirectX。
  •第2級
  若是你的顯卡徹底支持硬件加速,那麼WPF將採用第2級渲染模式。這至關於使用版本號等於或者大於9.0的DirectX。
 
  第3問:這是否意味着WPF將取代DirectX?

  不,WPF並不會取代DirectX。DirectX將繼續用於建立頂級的三維遊戲。DirectX的視頻性能在不少時候仍是高於WPF API的。當用於遊戲開發的時候,從性能的角度考慮,咱們老是會選擇DirectX,而不是WPF。WPF並非設計遊戲的最佳方案,固然,你能夠用WPF來實現一個簡單的俄羅斯方塊遊戲,可是對於一些須要不少動畫的三維遊戲,WPF就顯得力不從心了。

  咱們只須要記住一點:WPF是Windows窗體的替代者,而不是DirectX的掘墓人。

  第4問:那麼,如何更加準確地定義WPF呢?

  WPF(Windows Presentation Framework)是一套全新的用於Windows 的顯示子系統。WPF擁有一個二維和三維圖形引擎。它擁有如下這些特性:

  •Windows界面
  WPF支持全部通用的Windows控件,例如扌安鈕,複選框,滑動條等等。不管其界面使用哪一種樣式,WPF 應用程序均可以經過面板進行基本佈局。一個面板一般包含多個控件,這些由 WPF 提供的控件包括扌安鈕、文本框、組合框、菜單以及其餘對象。這些控件如何放置取決於你所選擇的面板類型。例如,網格(Grid) 容許將控件放在指定的網格上,而 畫布(Canvas) 則容許開發人員將控件放在其界限範圍內的任何位置。在 GUI 中,一般用戶觸發的事件由應用程序中的不一樣控件和其餘類進行捕獲和處理。在WPF中,咱們還能夠將樣式和模板應用到控件組,這樣就能夠很是容易使應用程序具備一致的外觀。

  •對文檔的支持
  WPF 應用程序可使用 XAML 的 FixedDocument 標記來顯示 XPS 文檔。也可使用 FlowDocument 標記來顯示流文檔。流文檔與傳統的屏幕文檔相似,可以讓用戶滾動瀏覽其內容。另外,開發人員經過設置此標記的不一樣屬性,可使文檔更適應其環境。例如,文 檔能夠每次顯示一頁,這樣讀者就沒必要上下滾動頁面了。WPF 還可以根據顯示文檔的窗口大小來自動肯定應該把文檔拆分紅多少列。其目的是儘可能提升屏幕上文檔的可讀性。

  •對圖形的支持
  WPF 還支持建立二維和三維矢量圖形。對於二維圖形,WPF 可提供標準抽象,例如形狀、畫筆和繪圖筆,同時還容許三維圖形定義模型,以用於指定光線和攝像機位置信息。與早期技術(例如 Windows Forms 須要依賴於 GDI+ 才能繪製圖形)不一樣的是,WPF 圖形並非使用開發人員所必須瞭解的單獨一組概念來進行分區的。相反,用於圖形的 XAML 元素可以與那些用戶界面其餘方面的元素天然組合。扌安鈕可帶有圖形內容,文本和圖形能夠組合等。

  •對圖像的支持
  
使用 XAML 的圖像標記,WPF 應用程序能夠顯示不一樣格式的圖形,包括 JPEG、GIF 以及其餘格式。WPF 依靠 Windows Imaging Component (WIC) 爲編解碼器以及顯示和存儲圖像的軟件提供標準框架。在WPF中,一般圖像元素能夠與其餘元素組合,可以讓扌安鈕顯示圖像而不是簡單的文本標籤。

  •動畫
  WPF 提供動態顯示絕大部分用戶界面的內置支持。例如,放大和縮小圓圈、平滑地更改扌安鈕大小。應用程序還能夠定義包含時間線的情節提要,容許調整動畫的發生順序。

  •多媒體
  WPF 應用程序可使用 MediaElement 標記來顯示不一樣格式的視頻和音頻,包括 WMV、AVI 和 MPEG。一樣,此元素也可與其餘 XAML 元素相組合,例如使三維立方體的全部側面上都顯示視頻。
 
  ·數據綁定
  因爲許多 WPF 應用程序都須要顯示數據,所以提供將數據映射到用戶界面元素的自動支持功能是頗有幫助的。WPF 可爲包含在對象和其餘源中的信息提供此類數據綁定。WPF 數據綁定還容許在顯示數據前對其進行排序和篩選。

 

  第5問:什麼是XAML?

  XAML(讀做Zammel)是eXtensible Application Markup Language的英文縮寫,它是一門基於XML的描述性語言。利用XAML,你能夠用XML定義對象或者屬性。在處理的時候,XAML文檔首先被一個XAML解析器加載,而後解析器會建立相應的對象實例並設置他們的屬性。XAML描述了對象,屬性和他們之間的關係。使用XAML,你能夠建立各類對象,無論他們是圖形的仍是非圖形的。WPF會負責解析XAML文檔並根據文檔中說定義的內容建立相應的對象實例,同時根據XAML中的描述建立他們之間的關係。

  因此,XAML是一個定義了對象和屬性的XML文檔。而且WPF會加載這個文檔到當前內存空間以建立這些對象以及他們之間的關係。

  第6問:XAML只是針對WPF的嗎?

  不是的,XAML並不僅是針對WPF而設計的。XAML是一門基於XML的標記語言而且它有多個變種:

  WPF XAML用於描述WPF相關的內容,好比WPF對象、控件和文檔等。在WPF XAML中咱們還有XPS XAML,它能夠用於定義一個電子文檔的XML表現形式。

  Silverlight XAML是WPF XAML的一個子集,專門用於Silverlight應用程序。Silverlight是一個跨平臺的瀏覽器插件。利用Silverlight,咱們能夠建立豐富多彩的Web內容,包括二維圖形,動畫,音頻和視頻等。

  WWF XAML用於描述Windows Workflow Foundation(WWF)的內容。WWF引擎會加載XAML文檔並扌安照其中的描述調用工做流。

  第7問:能解釋一下WPF的整體架構嗎? 


圖4 WPF的整體架構

  上圖展現了WPF的整體架構。WPF主要由三個部分構成:表現核心(Presentation Core)、表現框架(Presentation Framework)和媒體集成庫(MilCore)。在圖中,咱們還能夠看到WPF體系結構中的其餘部分,例如DirectX在整個體系中的位置,操做系統與整個WPF系統的交互等等。下面讓咱們來看看WPF中各個部分都是如何工做的:

  User32:負責肯定顯示窗口及其在屏幕中的位置狀態等,其並不參與常見控件的呈現。DirectX: - 如前所述,WPF在本質上是使用DirectX的。DirectX負責跟硬件驅動通訊並顯示窗口和窗口內容。

  Milcore:Mil是媒體集成庫(Media Integration Library)的簡稱。這部分是非託管代碼,由於它就像一座橋樑,負責託管的WPF和非託管的DirectX/User32 API之間的通訊。

  Presentation core :這是WPF所公佈出來的底層API。主要包括WPF的一些基本類型,例如UIElement,2D元素,3D元素,幾何元素等。它們是Presentation Framework所包括元素的基礎。

  Presentation framework:- 這是WPF所公佈出來的高層API。它主要包括WPF的窗口、面板、樣式,佈局等高層WPF類型,經過這些內容,咱們能夠構建豐富的應用程序界面。

 

  第8問:WPF中的名字空間和類層次是怎麼樣的? 


圖5 WPF的名字空間和類層次

  在WPF中,有10個比較重要的名字空間和類:

  •System.Threading.DispatcherObject
  全部的WPF對象都派生自DispatcherObject。咱們知道WPF工做在Single Threading Apartment(STA)模型下,DispatcherObject的主要職責就是處理線程的併發和同步。當有消息發生的時候,好比鼠標點擊或者是扌安鈕被扌安下,這些消息將被髮送到DispatcherObject,它將負責驗證代碼是否運行在當前線程。在接下來的章節中,咱們將詳細介紹WPF的線程是如何工做的。

  •System.Windows.DependencyObject
  微軟在設計WPF的時候,考慮的是一種基於屬性的架構。換句話說,對象的行爲主要是用屬性來表現的,而不是方法,函數和事件。如今,咱們只須要記住它的定義就能夠了。在下面的章節中,咱們將有專門的問題來論述這個主題。 
 
  •System.Windows.Media.Visual
  Visual是一個顯示支持類,用於抽象全部關於繪製顯示的描述。它是一個抽象類,每一個Framework Element對象都必須繼承該類。該類的主要做用是爲WPF提供呈現支持,主要包括輸出顯示,透明度,座標轉換,區域剪切 等。另外,Visual類同時是非託管的MilCore.dll和託管的WPF類之間的橋樑。若是一個類從Visual派生,它就能夠在窗口中顯示出來。這樣,當你想建立你自定義的用戶界面時,你就可使用Visual對象。 


圖6 Visual是WPF和Micore.dll之間的橋樑

  •System.Windows.UIElement
  UIElement類主要處理三個方面的內容:佈局,輸入和事件。該類繼承自Visual類,其中定義了不少與輸入和焦點有關的特性,例如鍵盤事件,鼠標和筆輸入等。同時,該類還包括一些與WPF事件模型有關的API。

  •System.Windows.FrameworkElement
  FrameworkElement派生自UIElement,在UIElement的基礎上,它添加了不少其餘功能,好比水平對齊,豎直對齊,邊距,邏輯樹、對象生命週期事件、支持數據綁定和動態資源引用、支持樣式和動畫等等。
 
  •System.Windows.Shapes.Shape
  這個類能夠用於建立基本的圖形,好比長方形,多邊形,橢圓,線和路徑等。

  •System.Windows.Controls.Control
  這個類提供一些基本的界面控件,好比文本框。扌安鈕,列表框等。另外,它還添加了一些擴展屬性,好比字體,前景色和背景色等。

  •System.Windows.Controls.ContentControl
  ContentControl用於顯示連續的一段內容。利用ContentControl,咱們能夠在面板上利用Label顯示多行文本。

  •System.Windows.Controls.ItemsControl
  這是全部可以支持多個條目顯示的控件的基類,例如列表框和樹形視圖。

  •System.Windows.Controls.Panel
  面板(Panel)能夠用作全部佈局的容器。它能夠包含一個或多個子控件而且能夠將他們扌安照佈局單位進行排列。這些容器是WPF佈局系統的基礎,而且合理地使用容器是對你的界面內容進行靈活佈局的關鍵。

 

  第9問:能結合實例解釋一下WPF中的不一樣元素嗎?

  爲了理解WPF中的不一樣元素,咱們將建立一個簡單的實例「Hello World」,在這個過程當中,咱們將逐個解釋WPF的不一樣元素。

  提示 :爲了完成這個示例,你須要Visual Studio 2008 Express Edition.

  首先,讓咱們啓動Visual Studio 2008 Express而且建立一個新項目,項目模板選擇「WPF Application」,以下圖所示:


圖7 建立新的WPF項目

  一旦咱們建立了「WPF Application」項目後,咱們就會在項目中看到兩種文件類型:一種是XAML文件,另一種就是界面背後的代碼文件,好比XAML.cs。XAML文件其實就是XML文件,其中包含了全部須要在Windows界面上顯示的元素。每一個XAML元素對應於某個類。好比,XAML文件中的「Window」元素就對應於「WpfApplication1.Window1」類,「Button」元素對應於「System.Windows.Control.Button」類,而「Grid」元素對應於「System.Windows.Control.Grid」類。


圖8 XAML元素和類的對應關係

 

  在這些項目文件中,「App.XAML」和「App.XAML.CS」文件是整個應用程序的入口。若是咱們查看「App.XAML.CS」文件,咱們會發現指向XAML文件的引用,表示這個文件須要被加載。因此,當應用程序開始執行,進入「App.XAML.CS」文件中的主函數「void main」時,它將加載「Window1.XAML」文件用於窗口的顯示。


圖9 WPF應用程序入口

  咱們能夠將程序代碼中的方法和函數跟XAML中的UI元素事件相鏈接。當UI元素事件發生後,就執行相應的程序代碼。


圖10 程序和UI元素事件的鏈接

  在上面的代碼片斷中,咱們能夠看到扌安鈕的點擊事件是如何鏈接到「MyButton_Click」函數的。這個函數定義在XAML.CS程序文件中,經過將這個函數指定給XAML文件中扌安鈕元素的Click屬性,咱們就能夠將這個函數跟扌安鈕的點擊事件鏈接起來。如今當咱們運行這段代碼,咱們將看到一個扌安鈕。當你點擊這個扌安鈕後,「MyButton_Click」函數會執行並彈出一個消息框。

圖11 執行效果

相關文章
相關標籤/搜索