1. 程式人生 > >WPF入門一:WPF和XAML簡介

WPF入門一:WPF和XAML簡介

  1. 什麼是WPF

    Windows Presentation Foundation的簡稱。專門用來編寫程式表示層的技術和工具。

  2. 學習WPF的好處:

    學習WPF技術可以為WCF的學習錦上添花。WF設計工作流,而設計WF的語言就是Xaml。學習WPF後,Silverlight可以算是會了80%,因為Silverlight可謂WPF的一個子集,是WPF的網路版。它在WPF的基礎上,去掉一些不常用的功能,簡化了一些功能的實現,新增網路通訊功能,最終讓WPF實現在瀏覽器中。另外Silverlinght是WP7手機平臺。所以學習WPF後,連手機平臺上的程式也會寫了。

            為了使程式碼解耦,人們研究出各種各樣的設計模式,如MVC,MVP。在WPF出現之前,winform和webForm等技術均使用"事件驅動":由事件→訂閱→事件處理器 關係交織在一起,儘管可以使用MVC,MVP,但是一不小心就會使睫毛邏輯和業務邏輯糾纏在一起,造成程式碼難懂,bug難排。WPF技術則是在開發理念的基礎上一次升級,由"事件驅動"變為"資料驅動"。

            事件驅動:使用者每一次操作都會觸發程式發生一個事件,事件發生後,用於響應事件的處理器就會執行,時間處理器就是一個方法(函式),在這個方法中,程式可以處理資料或者呼叫別的方法。依次完成了對業務需求的滿足。可見事件驅動時代的資料是靜態的被動的。介面控制元件是主動的,介面邏輯與業務邏輯之間的橋樑是事件。

            資料驅動,整好相反,當資料發生變化事,會主動通知介面控制元件,推動控制元件展示最新的資料。同時使用者對控制元件的操作會直接送達資料,就好像控制元件是"透明"的,可見,在資料驅動理念中,資料佔主動地位,控制元件和控制元件事件被弱化,(控制元件事件一般只參與介面邏輯,不再染指業務邏輯,使程式複雜度得到有效控制)WPF中,資料與控制元件關係就是哲學中內容與形式的關係,內容決定形式,所以資料驅動介面,這符合哲學原理。

  3. Xaml:(Extensible Application Markup Language可擴充套件應用程式標記語言,讀作zaml)微軟新的開發語言,在桌面開發中類似網路開發中的Html+css+js的角色。他是WPF技術中專門用於設計UI的語言。

    優點:1.可以設計出專業的UI和動畫(好用)

        2.不需要專業的程式設計知識,簡單易懂,結構清晰。(易學)

        3.使設計師能直接參與軟體開發,隨時溝通,無需二次轉化(高效)

                4.實現了UI和邏輯的分離。(解耦)

        關於解耦:自從應用程式從控制檯(Console User Interface,CUI)升級到圖形使用者介面(Graphic User Interface,GUI)後,程式設計師們就一直追求將檢視view程式碼和邏輯程式碼分離。因為如果檢視邏輯和業務邏輯糾纏在一塊構成高耦合度,就會造成1.瞭解程式碼困難,2.維護困難,(對於一個應用程式來說,後期維護的成本 )會大大超過開發成本,這是因為無論是UI的改變或者出現了bug,都會導致大量程式碼的修改。)3.重用性低。(高耦合度的設計如果需要更改一個新View,幾乎要變動全部程式碼,而低耦合的設計例如三層架構,只需更改view即可。而不用管業務邏輯和底層。Xaml真正實現了UI與邏輯 的分離,Xaml是一種單純的宣告型語言,它只能用來宣告UI元素,繪製UI和動畫。根本無法在其中新增程式邏輯,這就強制地把邏輯程式碼從UI趕走了)

  1. 專案模板:其實就是要建立的專案是什麼型別的。如Library類庫, ConsoleApplication控制檯應用程式,不同的模板,編譯器會呼叫它和類庫一起執行,變異成msil微軟中間語言,然後通過clr公共語言執行庫來執行中間程式碼,程式出不同的效果如類庫,控制檯程式。使用模板就是我們不用手動去配置自己要開發的東西和一些基本配置,省去了一些不必要的時間,提高了效率。
  2. 新建一WPF專案,會生成一系列的檔案。

    ProPerties:放資源和配置資訊。

    References引用類庫。

    App.xaml,類似Winform中的program.cs,它指定了哪個是主視窗,程式的程序是誰。

    Window.xaml,我們要建的Wpf窗體都類似Window.xaml,xaml是設計UI的,視覺化編輯,xaml.cs是後臺程式碼。

  3. XAML程式碼分析:

    語法XML派生而來,所以遵循XML語法,標籤必須閉合,每個標籤宣告一個元素(對應記憶體中的一個物件:XAML是"宣告"式語言,當聲明瞭一個標籤就意味著聲明瞭一個物件,物件之間的層級關係要麼是並列要麼是包含)。標籤中有屬性。

    非空標籤:<Tag Attribute1="value1"></Tag>

    空標籤:<Tag Attribute2="value2"/>

  4. 關於Property和Attribute

    Property是面向物件的範疇,是一個類的屬性,如年齡,性別

    Attribute特徵,語言層面上為了區分A和B加Attribute來區分,採用鍵值對,Attribute的範疇要大於Property。通常包含關係,因為大多數情況Property也是Attribute,即相互對應。

  5. 模板程式碼解析:

    如圖:第四行就是頂級物件元素Window的屬性。

         第二行第三行的"http://....."的地址其實並不是一個網站地址,它只是Xaml解析器的一個硬性編碼(把他理解為C#的const常量即可),它代表了一系列的程式集,對應如下:

它主要是些繪製UI 的程式集,是表現層(Presentation)上的東西。

對應Xaml語言解析處理相關的程式集。

屬性:xmlns="名稱空間",

xmlns是XML-Namespace,繼承XML語法,表示引用了一個名稱空間,類似WinFrom的Using。

屬性:xmlns:x="名稱空間"

語法xmlns[:可選的對映字首]="名稱空間",(個人覺得類似Winform引用名稱空間為了解決下圖問題而是用的using Excel = Microsoft.Office.Interop.Excel;同時因為使用了字首,每次呼叫這個名稱空間下的類,介面和屬性等等都要Excel。同理,如果Xaml名稱空間加了字首,呼叫標籤元素或者屬性也要如此,如<n:Grid n:Class>等等。這也是第一行Class前加n:的原因

每一個Xaml中僅有一個不帶字首的,那就是預設的名稱空間,所以一般把常用的與UI有關的Presentation設為預設名稱空間,其餘的包括自己引進的都要加字首,使用時也都要加字首。

    Window x:Class="MyfirstWPF.Window1"是指要解析器把包含Class屬性的Window標籤編譯成一個Window1類。同時我們發現後臺也是一個Window1類,這說明他們都是不分類,類似Winform中的後臺類與designer類。所以這個解耦與Winform原理是一致的。

小結:瞭解了這麼多,突然發現,有紮實的Winform知識,理解WPF是非常有利了,他們在繼承上和解耦思想上和使用上是如此的類似。但也有不同的地方,如Winform的designer檔案仍是一個部分類cs檔案,而WPF升級為一個Xaml檔案,使用了XML語法,在標籤頂級物件的Class中宣告生成了這個部分類。而WPF替代WINform就有太多的原因了,文章也說了Winform是事件驅動,而WPF是資料驅動原理,符合哲學。較Winform更好的解耦,WPF跨平臺,包括瀏覽器和移動開發。最後WPF在UI介面上更為漂亮,可以設計專業動畫3d等等

----參考《深入淺出WPF》