深入淺出WPF全系列教程及源代碼_第1頁
深入淺出WPF全系列教程及源代碼_第2頁
深入淺出WPF全系列教程及源代碼_第3頁
深入淺出WPF全系列教程及源代碼_第4頁
深入淺出WPF全系列教程及源代碼_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、深入淺出WPF全系列教程及源代碼前言:WPF 之 What&Why微軟Windows操作系統(tǒng)己經(jīng)成功推出10多年,在Window系統(tǒng)中從事圖形界而(Graphic User lnterface,GUI)的開發(fā)程序員數(shù)不勝數(shù),GUI程序員們手中的開發(fā)匚具經(jīng)歷了Win32API-MFC(及同類軟件產(chǎn)品)ActiveX/COM/Visual basicWinform 的變遷,每一次變遷都使得開發(fā)效率和質(zhì)星產(chǎn)生飛躍。從2007年開始,微軟推出新一代GUI 開發(fā)工具Window Presentation Foundationf直譯為Windows表示基礎(chǔ),WPF),并且把 WPF作為未來10年Windo

2、ws平臺開發(fā)GUI的主要技術(shù)。時至今Fh不僅Windows Vista、Windows7、Windows Server200& Windows Server2008R2 等系統(tǒng)已經(jīng)無縫集成了 WPF,連Visual Studio 2010等重要產(chǎn)品已使用WPF進行開發(fā),可見微軟在WPF技術(shù)方面的務(wù)實和創(chuàng)新。什么是WPF?WPF是Windows Presentation Foundation的簡稱,顧名思義是專門用來寫程序表示層的技術(shù)和工具。WPF的功能?WPF的功能是用來編寫應(yīng)用程序的表示層,至于業(yè)務(wù)邏輯層和數(shù)據(jù)層也有專門的新技術(shù),比如業(yè)務(wù)邏輯層的新技術(shù) WCF(Windows Communi

3、cation Foundation)和 WF(WindowsWorkflow Foundation)。微軟用于表示層開發(fā)的技術(shù)不算少,包括WPF,Windows Forms,ASP.NET, Silveright等。換句話說,無論使用哪種技術(shù)做為表示層技術(shù),程序的邏輯層和數(shù)據(jù)層都是相同的。WPF 和 Silveright 的關(guān)系目前,.NET開發(fā)人員學(xué)習(xí)WPF回報是非常高的,原因是在微軟整個新一代開發(fā)框架都能 看到它的影子,微軟新一代開發(fā)技術(shù)框架包括Windows Presentation Foundation(WPF), Windows Communication Foundation(WC

4、F), Windows Workflow Foundation(WF),在后 續(xù)的文章中我們會專注于將WPF,而WCF的用途是編寫分布式應(yīng)用程序的業(yè)務(wù)邏績層, 并以網(wǎng)絡(luò)服務(wù)的形式暴露給客戶端的服務(wù)消費者,基于WCF和Entity Framework的WCFData Service和WCF RIA Service是微軟迄今最佳的數(shù)據(jù)訪問層,而這一數(shù)據(jù)的最佳消費者就是WPF和Silveright,所以學(xué)習(xí)WPF技術(shù)會給WCF的學(xué)習(xí)錦上添花。WF的主要作 用是設(shè)計工作流,而設(shè)計工作流的編程語言正是WPF中界而編程語言-XMAL,學(xué)習(xí)完WPF, WF也就會了一小半。如果說學(xué)習(xí)完WPF完成以后就學(xué)會了一

5、小半的WF,那么學(xué)習(xí)完WPF以后,Silveright也 就學(xué)會了 80%,為什么這么說呢?因為微軟原本定義Silveright是WPF的子集,是WPF 的網(wǎng)絡(luò)版”(Silveright的開發(fā)代號為WPF/E,意為WPF簡化版)。為了讓W(xué)PF的瀏覽器跑 出來,微軟所做的事情就是在技術(shù)原理不變的情況下對WPF進行瘦身去掉一些不常用 的功能,簡化一些功能的實現(xiàn),對多組實現(xiàn)同一目的類庫進行刪減,只保留一組,在添加一些網(wǎng)絡(luò)通信功能,通過以下這張表,可以看到Silveright和WPF的技術(shù)重腔率之麗技術(shù)項目在WPF中在 Silverlight 中XAML語言完整完整控件完整完整布局完整完整Bindin

6、g完整基本完整依賴図性完整基本完整路由事件完整簡化命令完整無完整完整控件模板1完密基本完猿數(shù)據(jù)模板完整基本完整繪圖完整完整2D/3D動畫完鞭簡化如今Silveright炙手可熱的另一個原因是微軟上一代手機平臺Windows Phone 7也采用它 來作為開發(fā)平臺(此前的Windows Mobile使用的簡化版的Windows Form作為開發(fā)平臺)。 Windows Phone7中運行Silveright與瀏覽器中運行Silveright別無二致,因此學(xué)習(xí)完WPF 之后,手機平臺上的程序也會寫了。當然,Window Phone8將繼續(xù)支持這項技術(shù)。為什么要學(xué)習(xí)WPF?許多朋友也許會問:既然表示

7、層技術(shù)那么多,為什么還要推出WPF作為表示層技術(shù)呢?我 們話精力學(xué)習(xí)WPF有什么收益和好處呢,這個問題我們從兩個方而進行回答。首先,只要開發(fā)表示層程序就不可避免的要和4種功能性代碼打交道,他們分別是: 數(shù)據(jù)模型:現(xiàn)實世界中事物和邏輯的抽象。業(yè)務(wù)邏輯:據(jù)模型之間的關(guān)系和交互。用戶界面:由控件構(gòu)成,于用戶進行交互的界而,用于把數(shù)據(jù)展示給用戶并響應(yīng)用戶輸入。界而邏輯,控件與控制之間的的關(guān)系和交互。這4種代碼的關(guān)系如圖2所示:業(yè)務(wù)邏輯jnr數(shù)據(jù)??赵诒3执a可維護性的前提下,如何讓數(shù)據(jù)能夠順暢的到達界而并靈活顯示,同時方便的接 收用戶操作,歷來是表示層開發(fā)的核心問題,為此,人們研究出了各種各樣的設(shè)計模

8、式,其 中經(jīng)久不衰的 MVC(ModelView-Controler)模式,MVP(Model-View-Presenter)模 式等。在WPF出現(xiàn)之前,Winform, A都采用”事件驅(qū)動“理念,這種由”事件一訂閱一 事件處理器關(guān)系交織在一起構(gòu)成程序,盡管可以使用MVC, MVP模式,但一不小心就將界而邏輯和業(yè)務(wù)邏輯糾纏在了一起,造成代碼復(fù)朵難懂,Bug難以排除。ifn WPF則是微軟 在開發(fā)理念上的一次升級-由”事件驅(qū)動41變成了 數(shù)據(jù)驅(qū)動蔦數(shù)據(jù)驅(qū)動時代,用戶每進行一個操作會激發(fā)程序發(fā)生一個事件,事件發(fā)生以后,用于響應(yīng)事 件的事件處理器就會執(zhí)行,事件處理器是一個方法(函數(shù)),在這個方法中,

9、程序員可以處理 數(shù)據(jù)或調(diào)用別的方法,這樣,程序就在事件的驅(qū)動下向前執(zhí)行。可見事件驅(qū)動的數(shù)據(jù)是靜態(tài) 的,被動的;界而控件是主動的,界而邏輯和業(yè)務(wù)邏輯之間的橋梁是事件。而數(shù)據(jù)驅(qū)動正好 相反,當數(shù)據(jù)發(fā)生改變的時候會主動通知界而控件,推動控件展示最新的數(shù)據(jù);同時用戶的 操作會直接送達數(shù)據(jù),就好像控件是”透明的??梢?,在數(shù)據(jù)驅(qū)動理念里,數(shù)據(jù)占主導(dǎo)地位, 控件和控件事件被弱化(控件事件一般只參與界而邏輯,不再染指業(yè)務(wù)邏輯,使得程序復(fù)雜 度得到有效的控制)。WPF中,數(shù)據(jù)與控件的關(guān)系就是哲學(xué)中內(nèi)容與形式的關(guān)系,內(nèi)容決 定形式,所以數(shù)據(jù)驅(qū)動界面,這非常符合哲學(xué)原理,數(shù)據(jù)與界而間的橋梁就是數(shù)據(jù)關(guān)聯(lián)(Data B

10、inding),通過這個橋梁,數(shù)據(jù)可以流向界而,再叢界而流向數(shù)據(jù)源。簡而言之,WPF的開發(fā)理念更符合口然哲學(xué)的思想。使用WPF進行開發(fā)較之Winform開 發(fā)要簡單,程序更加簡潔清晰。其次,微軟將WPF理念擴展到兒乎所有的開發(fā)平臺,包括桌而平臺,瀏覽器平臺,手機平 臺。WPF的完整版可以運于在Windows下開發(fā)下的桌而應(yīng)用程序(當然,這些應(yīng)用程序也可以 在瀏覽器中運行。)WPF的簡化版Silveright,不但可以編寫運行于瀏覽器中的富客戶端程 序(Rich Internet Application),也可用于編寫微軟手機平臺中的軟件,所以這些程序的開 發(fā)理念都是一樣的,僅在類庫方而有一些差

11、別,也就是說,學(xué)會WPF開發(fā),Silveright和 Windows Phone軟件都可以觸類旁觀,投入這些精力是值得的。WPF 之 XMAL-XMAL 概覽微軟為了把開發(fā)模式從網(wǎng)絡(luò)開發(fā)移植到桌而開發(fā)和富媒體網(wǎng)絡(luò)程序的開發(fā)上,微軟創(chuàng)造了一 種新的開發(fā)語言XMAL(讀作 ZAML), XAML 全稱 Extensible Application MarkUp Languageo即可擴展應(yīng)用程序標記語言。它在做桌而開發(fā)和富媒體網(wǎng)絡(luò)程序開發(fā)中扮演 HTML+CSS+JS的角色,成為設(shè)計師和程序員溝通的樞紐?,F(xiàn)在設(shè)計師和程序員一起工作,共同維護軟件的版本,只是他們使用的軟件不一樣-設(shè)計 師使用Blen

12、d(Expression設(shè)計套件工具中的一個)來設(shè)計UI,程序員使用Visual Studio開 發(fā)后臺邏輯應(yīng)用代碼。Blend就像PhotoShop等設(shè)計工具,因此可以最大限度的發(fā)揮設(shè)計 師的特長。使用它,設(shè)計師不僅可以設(shè)計岀絢麗多彩的UI,還可以讓UI上包含動畫“雖 然程序員也可以做到這些,但從專業(yè)性,時間開銷以及技術(shù)要求上顯然是劃不來的。更重要 的是,這些絢麗的UI動畫都會以XMAL的形式直接保存進項目,無需轉(zhuǎn)化就可以直接編譯, 節(jié)省了大量的時間和成本。XAML的優(yōu)點:XAML可以設(shè)計出專業(yè)的UI和動畫一好用。XAML不需要專業(yè)的編程知識,它簡單易懂、結(jié)構(gòu)清晰一易學(xué)。XAML能使設(shè)計師直

13、接參與軟件開發(fā),隨時溝通、無需二次轉(zhuǎn)化一高效XAML這位翩翩君子的才華可遠不止于這些??趶膽?yīng)用程序從控制臺界而(Console User lnterface,CUI)升級為圖形界而(Graphic User Interface)后,程序員們就一直追求視圖(View,即UI)和業(yè)務(wù)邏輯的分離。以往的開發(fā)模式中, 程序員很難保證用來實現(xiàn)UI的代碼完全不與用來做業(yè)務(wù)邏輯處理的代碼糾纏在一起。UI代 碼和業(yè)務(wù)邏輯代碼糾纏在一起通稱為UI和邏輯的緊耦合,它往往帶來以下后果:無論是軟件的功能述是UI的設(shè)計有所變化或者是出現(xiàn)Bug,都將導(dǎo)致大量代碼的修改。會使得邏輯代碼更加難以理解修改往往比重寫更困難,因為

14、在修改之前必須要先讀懂。重用邏輯代碼編程了 Mission Imposible。XAML的另外一個大優(yōu)點就是:它幫助開發(fā)團隊真正的實現(xiàn)了 UI和業(yè)務(wù)邏輯的剝離。XMAL是一種單純的聲明型語言,這就是說它只能用來聲明一些UI元素、繪制UI和動畫(在XMAL 中實現(xiàn)動畫是不需要編程的),根本無法在其中加入程序邏輯,這就強制的把邏碌代碼從UI 中趕走了。這樣,與UI相關(guān)的元素統(tǒng)統(tǒng)集中在程序的UI層,與邏績相關(guān)的代碼統(tǒng)統(tǒng)集中在 業(yè)務(wù)邏輯層,形成了一種”高內(nèi)聚“低耦合的結(jié)構(gòu)。形成這種結(jié)構(gòu)后,無論是打算對UI進行 較人的改動述是打算重用底層邏輯,都不會花費太大力氣,這就好比你某一天給A客戶做 了一個桔子,

15、A客戶很喜歡,A客戶將口己的產(chǎn)品介紹給B客戶,B客戶喜歡桔子的味道,但是希望它看上去像香蕉這時候,你只需要將桔子的皮撕下來,換成香蕉的皮就可以了,只需要少星的成木就可以獲得和之前一樣大的收益(對于軟件的換膚功能,WPF提供了強大 的Template功能,將在后而詳述)WPF之從0開始學(xué)習(xí)XMAL剖析最簡單的XMAL代碼:html view plaincopyprint?1 .5. 6.7. .花花綠綠一大片,述有兩個像主頁地址的東西它們都是些什么呢,讓我們一個個來分析。XAML是由XML派生出來的語言,所以有很多在XML中的概念在XAML中是通用的。比 如使用標簽聲明一個元素(每一個元素對應(yīng)內(nèi)

16、存中的一個對象)時,需要使用其實標簽vtab 和結(jié)束標簽,夾在起始標簽和終止標簽中的XAML代碼表示隸屬于這個標簽的內(nèi)容。 如果沒有什么類容隸屬于這個標簽,可以寫為o為了表示同類標簽中的某個標簽的與眾不同,可以給它的特征(Attribute)賦值。為特征賦 值的語法如下:非空標簽:vtag Attribute1=value1 Attribute2=value2content空標簽vtag Attribute1=value1 Attribute2=value2/在這里有必要把Attribute和Property仔細地辨別一下。這個詞的混淆由來已久,混淆的主要原因是大多數(shù)的中文譯文里即把Attri

17、bute譯為矚性J 也把Property譯為“屬性S其實,這兩個詞表示的不是同一個層而上的東西。miProperty屬于而向?qū)ο蟮姆懂?。在使用而向?qū)ο缶幊痰臅r候,常常需要對客觀事物進行捕象,在把抽象出來的結(jié)果封裝成類,類中用來表示事物狀態(tài)的成員就是Propertyo比如要編寫一個模擬賽車的游戲,那么必不可少的就是要對現(xiàn)實的賽車進行抽象,現(xiàn)實中汽車會帶很多數(shù) 述會把汽車的加速,減速等行為提取出來用算法進行模擬,這個過程就是屬于抽象(結(jié)果是據(jù),但是游戲中可能只關(guān)心它的長度,寬度,高度,重量,速度等有限的幾個數(shù)據(jù),同時,Car這個類)。顯然,Car.Length,Car.Height,Car.Wei

18、ght等表達的是當前汽車所處的一個 狀態(tài),而Car.Accelerate。、Car.Break()表達的是汽車能做什么。因此,Car.Length,Car.Height就是Property的典型屬性,是針對對象而言的。將Property譯為“屬 性”也很貼切,總之一句話:Property屬性是針對對象而言的。Attribute則是編程語言文法層而的東酋。比如有兩個同類語法的元素A和B,為了表示A與B不完全相同或者A與B的用法上有些區(qū)別,這時候就要針對A和B加一些Attributeo 也就是說Attribute只與語言層而上的東西有關(guān),與抽象出來的對象沒有什么關(guān)系。因為Attribute是為了表

19、示“區(qū)分”的。所以它譯為41特征”。C#中的Attribute就是這種應(yīng)用的典型例子,我們可以為一個類添加Attribute,這個類里而有很多Property(屬性)。顯然,Attribute 只用來影響類中程序中的用法,而Property則對應(yīng)著抽象對象身上的性狀,根本不是一個 層而上的東西。習(xí)慣上,英語中把標簽式語言種表示個標簽特征的14名-值”對稱做Attribute-如果恰好有在使用一種標簽式語言做而向?qū)ο缶幊?,這兩個概念就有可能混在一起了。實際上,使用能 夠使用而向?qū)ο缶幊痰臉撕炇秸Z言只是把標簽和對象做了一個映射針對標簽還是叫做Attribute,針對對象述是叫做Property,仍

20、然不是一個層而上的東西。而且,標簽的Attribute 不是和對象的Property映射的,往往一個標簽對于的Atrribute大于他所映射對象的Property o因為XAML是用來在UI上繪制控件的,而控件本身就是面向?qū)ο蟮某橄螽a(chǎn)物,所以XAML 標簽中的Atrribute有一大部分和它對應(yīng)他的對象的Property是 對應(yīng)的。當然,這還意 味著標簽中的Atrribute并不對應(yīng)它所代表對象的Property明口了 XAML的格式以及Atrribute和Property之間對應(yīng)的關(guān)系,對上而的代碼可謂是一目 了然。它的總體結(jié)構(gòu)是一個Window標簽內(nèi)包含一個Grid標簽(或者說Grid標簽

21、是Window 標簽的內(nèi)容),所代表的內(nèi)容是一個Window對象里而包含一個Grid對象。html view plaincopyprint?1 .2. 3.3. 4. XAML是一種聲明式語言,當你看見一個標簽,就證明你聲明了一個對象,對象之間的關(guān)系 要么是并列,包含全都體現(xiàn)在標簽的關(guān)系上。下而的代碼就是標簽的Atrribute。html view plaincopyprint?1. x:Class=WpfApplication2.Window22. xmlns=n aml/presentatiorT3. xmlns:x=n4. Title=uWindow2n Height=H300n Wid

22、th=H300H其中Title Width. Height 看就知道和Window的Property對象對應(yīng)的。中間兩行(即 兩個xmlns)實在聲明名稱空間。最上而一行是在使用名為class的Attribute,這個Attribute 來自于X:前綴所對應(yīng)的名稱空間。下面仔細解釋。前而已經(jīng)說過,XMAL語言是從XML語言派生而來的。XML有一個功能就是可以在XML 文檔的標簽內(nèi)使用xmlns特征來定義名稱空間(NameSpace) , XML也就是 XML-NameSpace的縮寫。定義名稱空間的好處就是,當來源不同的類重名時,可以使用 名稱空間加以區(qū)分。xmlns特征的語法如下:html

23、view plaincopyprint?1 .xmlns:可選的映射前綴=“名稱空間Illxmlns后可以跟一個可選的映射前綴,之前用冒號隔開。如果沒有寫可選映射的前綴,那就意味著所有來口這個名稱空間的所有標簽都不用加這個前綴,這個沒有映射的命名空間稱為 44默認的命名空間J默認名稱空間只能有一個,而且應(yīng)該選擇其中使用最頻繁的名稱空間來 作為默認命名空間。在上而的例子中,vWindow和vGrid來口于第二行聲明的默認命名空 間,而第一樣的CLASS特征則來來口于三行的中x:前綴對應(yīng)的名稱空間。這里可以做一個 有趣的小實驗:如果給第二行聲明的名稱空間加一個前綴,例如m那么代碼必須要改成一 下形

24、式編譯才能通過:html view plaincopyprint?1 .5. 6.6. 7. XAML中引用外來程序集和其中.NET名稱空間的語法和C#是不一樣的。在C#中,如果想使用System.Windows.Control名稱空間內(nèi)的Button類,需要先把包含System.W泊dows.Control名稱空間的程序集PresentationFramework.dll添加引用到項目中,然后再用C#代碼頂部寫上一句:using System.Windows.Control;在XAML中做同樣的事情也需要添加對程序集的引用,然后再在根元素的起始標簽中寫上一 句:xmlns:c=”clrnam

25、espace:SystemWindowsC on trol;assembly=Presentatio nF rameworkHo c是映射的前綴,換成其它字符串也可以。因為button來口前綴為c的命名空間,所以 在使用button的時候就要使用.o中有口動提示功能。xmlns:c=Hclr- namespace:System Windows. C on trol;assemble=PresentationFrameworkH,這么長的一串字符串看上去的確有點恐怖,但不用擔(dān)心,VS200在VS2008 A動提示的頂部,你會看到幾個像網(wǎng)站地址的幾個名稱空間,其中就包含例子 代碼中的那兩行。為什么

26、名稱空間看上去想一個網(wǎng)站地址呢。其實把它copy到瀏覽器地址 欄嘗試跳轉(zhuǎn)也不會打開網(wǎng)頁。這里只是XAML解釋器的一個硬性編碼(hard-coding),只 要見到這些固定的字符串,就會把一系列的程序集和程序集中包含的名稱空間引入進來。圖25 VS 2008的自動提示功能httpy/K hemavmK rowftc om/wmfx/2006/xaml 串 http/KhemMrnKrosoftcom/wmfx/2006/xamt/composite-font r http:/schemas.mKrosoftotVwwifx/2006/xirnpresentation tf http:/shcmM

27、.mKrosoftxl&KK m assembly System uif MKro$oft.Win32 in M$embly mscorlib T Microsoft Win32 m assembly PresentMionF r MYewort W Mk rosoftWin32 m ancmb Sjrstem圖2-6 VS 2008 f l動提示頂部的幾個名稱空間默認引入的這兩個名稱空間格外的重要,它們對應(yīng)的程序集和met名稱空間如下: 對應(yīng):Syste m. Windows;System.Windows.Automatio n;System.Windows.Control;System.W

28、indows.Control.Primitives;Syste m .Win dows.Data;System. W 泊 dows. Document;System. W 泊 dows.Forms.lntergration;System.Windows.Ink;System.Windows.Input;Syste m.Windows.Media;System.Windows.Media.Animatio n;Syste m.Wind ows.Media.Effects;System.Windows.Media .Imaging;System.Windows.Media.Media3D;Syst

29、em.Windows.Media.TextFormmatting;System. W indows.Navigatio n;System. Wi ndows. Shapes;也就是說你可以在XAML中可以直接使用這些CLR名稱空間下的類型(因為默認XML名 稱空間前沒有前綴)。 則對應(yīng)一些與 XAML 語法和編譯相關(guān)的CLR名稱空間,使用這些名稱空間中的類型需要加上前綴x,因為它們被映射到x的XML 名稱空間中。從這兩個名稱空間的名字和它所對應(yīng)的.NET程序集上,這個不難看出,第一個空間名稱對 應(yīng)的是繪制UI相關(guān)的程序集,是表示(Presentation)層而上的東西;第二個名稱空間則對應(yīng) 著

30、XAML解析處理相關(guān)的程序集,是語言層面上的東西。還剩下 x:Class=WpfApplication2.Window2這個 Attributeo x 前綴說明這個 Attribute 來著于X映射的名稱空間前而我們解釋過,這個名稱空間對應(yīng)XAML解析功能的。x:Class, 顧名思義他與類有一些關(guān)系,是何種關(guān)系呢,讓我們做一個有趣的實驗: 首先,x:Class=MWpfApplication2.Window2,f這個 Attribute 刪掉,再到 Windows.xaml.cs 文件里,把構(gòu)造中對InitalizeComponent方法的調(diào)用也刪掉。編譯程序,你會發(fā)現(xiàn),程序依然可以運行,為

31、什么呢?打開App.xaml這個文件,你會發(fā)現(xiàn)這樣一個AttributeStartupUri=,Window1 .xaml1,是它告訴編譯器把 Windowl .xaml 作為程序啟動 的主窗體。也就是說,只要Windowsl.Xaml能夠被解析為一個窗體,程序就能夠運行。然后只恢復(fù) x:Class=nWpfApplication2.Window2f,這個 Attribute(不恢復(fù) InitalizeComponent方法的調(diào)用)。編譯之后仍然可以運行,這是使用IL Disassembled中間語言凡編譯器)打開項目的編譯結(jié)果,你會發(fā)現(xiàn)在由項目編譯生成的程序集里而包含一個名為Window2的

32、類, 如下圖所示Il OtMisemblefMicrosoft Windows SDK vX)A Tools * Fusion Log ViewerInsUM Microsoft FXCop3 Manifest Generation and Editing圖27中間語當反編譯器的位賈這說明,XAML這個Attribute的作用是當XAML解析器將它的標簽解析成C#類之后,這個 類的類名是什么。這里已經(jīng)觸碰到XAML的本質(zhì)。前面我們已經(jīng)看到,事例代碼的結(jié)構(gòu)就 是使用XAML語言直觀的告訴我們,當前的窗體是一個Window里面嵌入了一個Grido 如果是使用C#完成同樣的設(shè)計呢?顯然,我們不可能去

33、更改Window這個類,我們能做的 是從Window派生一個類,再為這個類添加一個Grid類型的字段,然后把這個字段初始化 的時候賦值給派生類的類容屬性。代碼看起來大概是這樣:圖2-8項目編譯后生成的WindowABC類csharp view plaincopyprint?1. using System;2. using System.Collections.Generic;3. using SysteulLinq;4. using System.Text;5. using System.Windows;6. using System.Windows.Controls;7. using Sys

34、tem.Windows.Data;.using System.Windows.Documents;8. using System.Windowsnput;9. using System.Windows.Media;10. using System.Windows.Mediamaging;12 using System.Windows.Shapes;13.14. namespace WpfApplication215. 16. Ill 17. /Window2.xaml 的交互邏輯1.III 19. public partial class Window2 : Window20. 21. pri

35、vate Grid grid;22. public Window2()23. 24. grid = new Grid();25. this.C on tent = grid;26. 27. 28.最后讓讓我回到最初的代碼。你可能會問:在XAML里而有x:Class=WpfApplication2.Window2,*,在 Windows2.xaml.cs 里而也聲明了 Window2 這個類,難道他們不會沖突嗎?仔細看看Windows2.xaml.cs中Window2的聲明就知道了在聲明的時候使用的是partial關(guān)鍵字,這樣,這樣由XAML中解析成的類和C#文件里而定義的部分就合二為1 了,正

36、是由于這種partial機制,我們可以把邏輯代碼留在cs文件里,用C#語言來實現(xiàn),而把那些聲明及布局UI元素的代碼分離出去,實現(xiàn)UI和邏銀分離,并且,用于繪制UI的代碼(如聲明控件類型的字段,設(shè)置它們的外觀和布局等)也不必再使用C#語言,使用XAML和XAML編輯工具就可以輕松搞定。至此,你應(yīng)該對這個簡單的XAML程序了然于胸了。WPF學(xué)習(xí)系統(tǒng)的學(xué)習(xí)XAML語法1, XAML文檔的樹形結(jié)構(gòu):UI在用戶眼里而是個平而結(jié)構(gòu)。如下圖所示,在用戶眼里看來,這個界而就是一個窗體里而平鋪了 4個文木框和一個按鈕的界而。 Window2在傳統(tǒng)的 Visual C+、Delphi、Visual Basic6.

37、0 和 Windows Form 程序員的思維里,Ul 也是一個平而的結(jié)構(gòu)。因此,程序員要做的事情就是根據(jù)美工給的給定的UI布局把控件安 置在窗體的表而,并用使用長度,寬度和間距把控件對齊。與傳統(tǒng)的設(shè)計思維不同,XAML使用樹形邏輯結(jié)構(gòu)來描述UI,下而是用來描述界而布局的XAML代碼:1.2.html view plaincopyprint?.8. 9. 10. 11. 12. 13. 14. 15. 16. 因為代碼中有許多對Attribute的屬性,所以結(jié)構(gòu)看起來并不是那么清晰。如果我們把對Attribute的賦值都去掉,那么上而的代碼就顯現(xiàn)了它的樹形框架結(jié)構(gòu)。 html v

38、iew plaincopyprint?1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 如果用一張圖來表示上而的那段代碼,它會是下而這個樣子有意思的是,針對一個“看上去一樣”的UI布局,XAML代碼不一定是唯一的。拿上而的 UI代碼布局來說,我們還可以使用不同的XAML代碼來描述它。html view plaincopyprint?1. 5. 6 7. 8. 9 10Height=,42 /Height=,48H /Height=,66 /Height=,l153RowDefinition RowDefinition RowDefinition 15. 16

39、 17. 18. 19. 20. Button HorizontalAlignment=,Center Margin=10 1000 Name=,buttonlH VerticalAlignment=HTop Grid.Row=,3HGrid ColumnSpan=,2,21. 22. 23. 24. 精簡后的代碼是:html view plaincopyprint?1. 2. 3.4. 5. 6. 7. 8. Button9. 1111.11. 框架變成了如圖所示的樣子:1Window IWindowTextBox I | TextBox I I TextBoxTextBoxIextBoxl

40、extBoxTexBoxButtonImageButtonImage雖然兩段代碼對Ul的實現(xiàn)方式不同,但是框架都是樹形的,以Window對象為根節(jié)點, 一層一層向下包含。這種樹形結(jié)構(gòu)對于WPF整個體系都具有非常重要的意義,它不但影響 著UI的布局設(shè)計,還深刻的影響著WPF的屬性(Property)子系統(tǒng)和事件(Event)子系統(tǒng)等 方方而而。在實際的編程過程中,我們經(jīng)常要在這棵樹上進行按名稱查找元素,獲取父/子 節(jié)點等操作,為了方便操作這棵樹,WPF基木類庫為程序員準備了 VisualTreeHelper和 LogicTreeHelper兩個助手類(Helper Class),同時還在一些重要

41、的基類里封裝了一些專門 用于操作這棵樹的方法。你也許可能會問:既然有這么多方法可以實現(xiàn)同一個UI,到底應(yīng)該選擇哪一種方式來實現(xiàn)UI呢?實際上,設(shè)計師給出的UI布局是軟件的一個靜態(tài)快照(Static Snap),這個靜態(tài)快照加上用戶有可能動態(tài)操作才能夠構(gòu)成選擇實現(xiàn)布局形式的完整依據(jù),拿上而兩段代碼 來說,如果你希望用戶在改變窗體大小后需要等比例縮小口己內(nèi)部控件的尺寸,那么你選 擇第二種,如果只希望控件在界而上做一個簡單的排列,第一種足矣。2, XAML中為對象賦值的方法XAML是一種聲明性語言,XAML會為每一個標簽創(chuàng)建一個與之對于的對象,對象創(chuàng)建之 后要對它的屬性進行必要的初始化之后才有使用意

42、義。因為XAML語言不能夠編寫程序的 運行邏輯,所以一份XAML文檔除了使用標簽聲明對象就是初始化對象屬性了。注意:XAML中對對象賦值總共有兩種方法:A:使用字符串進行簡單賦值。:使用屬性元索(Property Element)進行復(fù)雜賦值。我用一個vRectangle標簽的Fill為例來介紹這兩種方法:2.1使用標簽的Attribute為對象屬性賦值前面我們已經(jīng)知道,一個標簽的Attribute有一部分與對象的Property對應(yīng), 標簽里而的Fill這個AHribute就是這樣,他與Rectangle類對象的Fill屬性對應(yīng),在MSDN 文檔庫里可以查詢到,Retangle類的Fill類

43、型是一個Brusho Brush是一個抽象類,凡是已Brush為基類的類都可以成為Fill的屬性值。Brush的派生類有很多: SolidColorBrush:單色畫刷。 LinearGradientBrush: 性漸變畫刷。 RadialGradientBrush:徑向漸變畫刷。 ImageBrush:位圖畫刷。 DrawingBrush:矢暈圖畫刷。 VisualBrush:可視元素畫刷。下而這個例子是使用SolidColorBrsh和LinearGradientBrush兩種。我們先學(xué)習(xí)使用字符串對Attribute的簡單賦值,假設(shè)我們的Rectangle只需要填充成單 一的藍色,那么我

44、們只需要簡單的寫成:html view plaincopyprint?1. 5. 6. 7. 運行效果如下圖:我們看到,blue這個字符串最終被翻譯成了 SolidcolorBrush并賦值給了 Rectangle對象。換成C#代碼是這樣。csharp view plaincopyprint?1. SolidColorBrush brush = new SolidColorBrush();2. brush.Color = Colors.Blue;3. this.rectanglel.Fill = brush;需要注意的是,這種Attribute=Value的賦值時,由于XAML語法有限,Val

45、ue只能是一個字符串值,這就引發(fā)了下而兩個問題:A,如果一個類可以使用XAML類來進行聲明,并允許它的的Property可以和它的Attribute互相映射,那就需要為這些Property準備適當?shù)霓D(zhuǎn)換機制。B,由于Value是個字符串,所以其格式復(fù)雜程度有限,盡管可以在轉(zhuǎn)換機制里而包含一定 的按格式解析字符串的功能以便轉(zhuǎn)換成較復(fù)雜的目標對象,但這會讓最終的XAML使用者 頭疼不已,因為他們不得不在一個沒有編碼輔助的情況下手寫一個格式復(fù)雜的字符串來滿 足需求。第一個問題的解決方式是使用TypeConverter類的派生類,在派生類里而重新 TypeConverter的一些方法,第二個問題的解決辦法就是使用屬性元素(Property Element)。2.2使用TypeConverter類將XAML標簽的Attribute與對象的Property進行映射注意本小節(jié)的例子對于初學(xué)者來說理解起來比較難而且實用性不大,主要是為喜歡刨根問底的WPF JF發(fā)人員準備的,初學(xué)者可以跳過這一節(jié)。首先我們準備一個類:c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論