Window Presentation Foundation系列—從HelloWorld認知WPF

來源:互聯網
上載者:User

 

聲明:歡迎任何人和組織轉載本blog中文章,但必須標記文章原始連結和作者資訊。  

本文連結:http://blog.csdn.net/li_007/archive/2010/11/02/5982660.aspx

開拓進取的小烏龜------->CSDN點滴點點滴滴Blog

 

 

ok,作為一個Programmer,絕大部分人對一種全新的語言的第一個程式應該都是Hello,World吧。在這裡我也從這個開始,一個最簡單的Hello World。代碼如下:

using System;<br />using System.Windows;<br />namespace HelloWorld<br />{<br />class HelloWorld<br />{<br />[STAThread]<br />public static void Main(string [] args)<br />{<br />//Console.WriteLine("Hello, World! This is a most simple WPF Application");<br />}<br />}<br />} 

使用命令列編譯,如下 csc /out:./HelloWorld.exe HelloWorld.cs。編譯成功運行,會顯示Hello, World! This is a simple WPF Application的一個訊息框。其實這個WPF很不完整,沒有使用任何的WPF服務。到底真正的WPF包含哪些關鍵的組件(或者核心的DLL檔案)已經WPF能夠做些什嗎?我們可以通過下面的圖片來理解.

                                                  

圖 1

 

中標為暗紅色的是WPF的三大核心組件,其中milcore組件,它的職責是完成與Direct3D的互動。並且出於效率和安全考慮,milcore由Unmanaged 程式碼實現。WPF 中的所有顯示是通過 DirectX 引擎完成的,可實現高效的硬體和軟體呈現。WPF 還要求對記憶體和執行進行精確控制。milcore 中的組合引擎受效能影響關係大,需要放棄 CLR 的許多優點來提高效能。WPF的另外兩大核心組件PresentationFramework和PresentationCore都位於通用語言運行庫(CLR)之上。而那麼就可以看出,WPF的大部分代碼都是以託管形式存在的。這兩大組件提供了WPF項目需要的函數庫和功能庫,由於是以託管的形式存在,所以也避免了我們直接操作底層和出現諸如記憶體泄露的可能性。

                     

圖 2

 

從上面的這幅圖可以看出一共分成了五大塊(Core Presentation、User Interface Services、Base Services、Document Servies和XPS Viewer):

  • Core Presentation:包含了所有的圖形效果,形、2D圖形、3D圖形、文本、音頻、視頻和顯示效果。同時還包括強大的動畫效果,動畫可以應用前面的所有元素。最下面的那個就是視覺基本元素。
  • User Interface Services:包含了應用程式服務、部署服務、控制項陳列庫、布局和資料繫結.
  • Base Services:提供了XAML支援、提高開發效率、輸入和事件的支援、屬性系統。
  • Document Servies和XPS Viewer則提供了基本的列印和表報服務,可以通過這些組件實現自訂的列印和顯示效果。

 

好了,再繼續改進Hello World,改進後的代碼如下:

 

using System;<br />using System.Windows;<br />namespace HelloWorld<br />{<br />class HelloWorld<br />{<br />[STAThread]<br />public static void Main(string [] args)<br />{<br />//MessageBox.Show("Hello, World! This is a simple WPF Application");</p><p>Window wnd = new Window();<br />wnd.Width = 800;<br />wnd.Height = 600;<br />wnd.Title = "Hello World";<br />wnd.Show();</p><p>Application app = new Application();<br />app.Run();</p><p>}<br />}<br />}

再次通過命令列編譯,編譯命令如下(這裡為了便於理解,我對編譯命令做了排版,實際使用中並不需要這樣) 

 

 

csc  /target:winexe /out:./HelloWorld.exe

/reference:"C:/Program Files/Reference Assemblies/Microsoft/Framework/v3.0/presentationframework.dll"

/reference:"C:/Program Files/Reference Assemblies/Microsoft/Framework/v3.0/windowsbase.dll"

/reference:"C:/Program Files/Reference Assemblies/Microsoft/Framework/v3.0/presentationcore.dll"

HelloWorld.cs

 

 

注意,在這裡引用了prensentationframework.dll、presentationcore.dll和windowsbase.dll這三個WPF的核心DLL。

在這裡使用.net Reflector(http://reflectoraddins.codeplex.com/)來查看編譯後的exe檔案的IL代碼如下:

圖 3

 

由,我們可以清楚地看出來,WPF程式的編譯過程,並且可以看到它連結了那些WPF組件。

當然,一個真正的WPF程式遠不止一個訊息對話方塊或者一個簡單的什麼都沒有的表單而已,它是需要有Application類的執行個體。在這裡我們來分別繼承一個Application和Windows,具體代碼如下:

using System;<br />using System.Windows;<br />namespace HelloWorld<br />{<br />class HelloWorld : Application<br />{<br />[STAThread]<br />public static void Main(string [] args)<br />{<br />/*#region // simple I<br />MessageBox.Show("Hello, World! This is a simple WPF Application");<br />#endregion // simple I</p><p>#region // simple II<br />Window wnd = new Window();<br />wnd.Width = 800;<br />wnd.Height = 600;<br />wnd.Title = "Hello World";<br />wnd.Show();</p><p>Application app = new Application();<br />app.Run();<br />#endregion // simple II<br />*/<br />#region // simple III<br />HelloWorldWnd wnd = new HelloWorldWnd();<br />wnd.Show();</p><p>HelloWorld helloWorld = new HelloWorld();<br />helloWorld.Run();<br />#endregion // simplw III<br />}<br />}</p><p>class HelloWorldWnd : Window<br />{<br />public HelloWorldWnd()<br />{<br />this.Width = 400;<br />this.Height = 300;<br />this.Title = "Hello World Windows";<br />}<br />}<br />}

同樣使用Reflector來查看IL代碼,如下所示:

圖 4

 

圖 5

上倆圖分別是從Application繼承的類HelloWorld和從Window繼承的HelloWorldWnd類的IL代碼,比較圖3,基本上是一樣的過程,只不過分別是倆個類而已。

不過通過最後的HelloWorld和HelloWorldWnd類,我們可以看出來,其實可以將WPF的代碼分隔開來,HelloWorld裡面實現了WPF的“行為”;而HelloWorldWnd則實現了WPF的“外觀”。這樣我們就可以分別將注意力放在不同的事情上,比如設計師可以專註於UI設計,而軟體工程師則可以專註於程式的邏輯處理。好了,如果我們為WPF的“外觀”的代碼定義一種聲明式的格式,並且這種格式的檔案可以通過工具拖拽等方式來建立,那就Perfect了。是不是描述的有點像flex啊,好了其實我們是幸運的,MS為我們實現了這些。具體的在WPF中表現為XAML格式。用XAML來實現HelloWorldWnd類的代碼如下:

<!-- HelloWorldWindow.axml --><br /><Window x:Class = "HelloWorld.HelloWorldWnd"<br />xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"<br />xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"<br />Title="Hello World Windows"<br />Width="400" Height="300"><br /></Window> 

其實很簡單的,一種聲明式的文法,簡單地描述了這個windows的特徵。XAML的規範定義了一些規則,來把.Net的命名空間、類型、屬性、事件等一系列元素映射成XAML的命名空間、元素和特徵。XAML被儘可能地設計成直接映射,比如一個XAML元素就映射一個.Net的類名,一個XAML屬性(Attribute)就映射成相應類的屬性(Property)名或者類的相應的事件名。這樣XAML不僅僅只能為WPF類所用,還可以讓有預設建構函式的.Net的類可以在XAML檔案中直接完成初始化。比如上面的Window類

 

好了,我們看看Visual Studio .Net 2010建立的一個WPF Application項目的結構圖,如下:

圖 6

 

從圖6中標準WPF程式結構圖可以看出,WPF需要PresentationCore、PresentationFramework和WIndowsBase這三個核心的組件的支援;XAML和Code-behind檔案的關係;關鍵字partial在WPF中的作用。

 

程式碼後置(code-behind)檔案的副檔名為.xaml.cs,它包含了xaml中未定義的部分,通過關鍵字partial讓編譯器把它和xaml定義合成一個完整的類定義。一般在程式碼後置檔案中實作類別的一“行為”處理,比如元素是事件等。

 

通過上面的例子,大概瞭解清楚了WPF程式的基本架構,當然一些具體的細節,需要自己具體去查詢MSDN等資料。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.