版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、深入淺出WPF全系列教程及源代碼前言:WPF 之 What&Why微軟Windows操作系統(tǒng)己經(jīng)成功推出10多年,在Window系統(tǒng)中從事圖形界而(Graphic User lnterface,GUI)的開(kāi)發(fā)程序員數(shù)不勝數(shù),GUI程序員們手中的開(kāi)發(fā)匚具經(jīng)歷了Win32API-MFC(及同類(lèi)軟件產(chǎn)品)ActiveX/COM/Visual basicWinform 的變遷,每一次變遷都使得開(kāi)發(fā)效率和質(zhì)星產(chǎn)生飛躍。從2007年開(kāi)始,微軟推出新一代GUI 開(kāi)發(fā)工具Window Presentation Foundationf直譯為Windows表示基礎(chǔ),WPF),并且把 WPF作為未來(lái)10年Windo
2、ws平臺(tái)開(kāi)發(fā)GUI的主要技術(shù)。時(shí)至今Fh不僅Windows Vista、Windows7、Windows Server200& Windows Server2008R2 等系統(tǒng)已經(jīng)無(wú)縫集成了 WPF,連Visual Studio 2010等重要產(chǎn)品已使用WPF進(jìn)行開(kāi)發(fā),可見(jiàn)微軟在WPF技術(shù)方面的務(wù)實(shí)和創(chuàng)新。什么是WPF?WPF是Windows Presentation Foundation的簡(jiǎn)稱,顧名思義是專門(mén)用來(lái)寫(xiě)程序表示層的技術(shù)和工具。WPF的功能?WPF的功能是用來(lái)編寫(xiě)應(yīng)用程序的表示層,至于業(yè)務(wù)邏輯層和數(shù)據(jù)層也有專門(mén)的新技術(shù),比如業(yè)務(wù)邏輯層的新技術(shù) WCF(Windows Communi
3、cation Foundation)和 WF(WindowsWorkflow Foundation)。微軟用于表示層開(kāi)發(fā)的技術(shù)不算少,包括WPF,Windows Forms,ASP.NET, Silveright等。換句話說(shuō),無(wú)論使用哪種技術(shù)做為表示層技術(shù),程序的邏輯層和數(shù)據(jù)層都是相同的。WPF 和 Silveright 的關(guān)系目前,.NET開(kāi)發(fā)人員學(xué)習(xí)WPF回報(bào)是非常高的,原因是在微軟整個(gè)新一代開(kāi)發(fā)框架都能 看到它的影子,微軟新一代開(kāi)發(fā)技術(shù)框架包括Windows Presentation Foundation(WPF), Windows Communication Foundation(WC
4、F), Windows Workflow Foundation(WF),在后 續(xù)的文章中我們會(huì)專注于將WPF,而WCF的用途是編寫(xiě)分布式應(yīng)用程序的業(yè)務(wù)邏績(jī)層, 并以網(wǎng)絡(luò)服務(wù)的形式暴露給客戶端的服務(wù)消費(fèi)者,基于WCF和Entity Framework的WCFData Service和WCF RIA Service是微軟迄今最佳的數(shù)據(jù)訪問(wèn)層,而這一數(shù)據(jù)的最佳消費(fèi)者就是WPF和Silveright,所以學(xué)習(xí)WPF技術(shù)會(huì)給WCF的學(xué)習(xí)錦上添花。WF的主要作 用是設(shè)計(jì)工作流,而設(shè)計(jì)工作流的編程語(yǔ)言正是WPF中界而編程語(yǔ)言-XMAL,學(xué)習(xí)完WPF, WF也就會(huì)了一小半。如果說(shuō)學(xué)習(xí)完WPF完成以后就學(xué)會(huì)了一
5、小半的WF,那么學(xué)習(xí)完WPF以后,Silveright也 就學(xué)會(huì)了 80%,為什么這么說(shuō)呢?因?yàn)槲④浽径xSilveright是WPF的子集,是WPF 的網(wǎng)絡(luò)版”(Silveright的開(kāi)發(fā)代號(hào)為WPF/E,意為WPF簡(jiǎn)化版)。為了讓W(xué)PF的瀏覽器跑 出來(lái),微軟所做的事情就是在技術(shù)原理不變的情況下對(duì)WPF進(jìn)行瘦身去掉一些不常用 的功能,簡(jiǎn)化一些功能的實(shí)現(xiàn),對(duì)多組實(shí)現(xiàn)同一目的類(lèi)庫(kù)進(jìn)行刪減,只保留一組,在添加一些網(wǎng)絡(luò)通信功能,通過(guò)以下這張表,可以看到Silveright和WPF的技術(shù)重腔率之麗技術(shù)項(xiàng)目在WPF中在 Silverlight 中XAML語(yǔ)言完整完整控件完整完整布局完整完整Bindin
6、g完整基本完整依賴図性完整基本完整路由事件完整簡(jiǎn)化命令完整無(wú)完整完整控件模板1完密基本完猿數(shù)據(jù)模板完整基本完整繪圖完整完整2D/3D動(dòng)畫(huà)完鞭簡(jiǎn)化如今Silveright炙手可熱的另一個(gè)原因是微軟上一代手機(jī)平臺(tái)Windows Phone 7也采用它 來(lái)作為開(kāi)發(fā)平臺(tái)(此前的Windows Mobile使用的簡(jiǎn)化版的Windows Form作為開(kāi)發(fā)平臺(tái))。 Windows Phone7中運(yùn)行Silveright與瀏覽器中運(yùn)行Silveright別無(wú)二致,因此學(xué)習(xí)完WPF 之后,手機(jī)平臺(tái)上的程序也會(huì)寫(xiě)了。當(dāng)然,Window Phone8將繼續(xù)支持這項(xiàng)技術(shù)。為什么要學(xué)習(xí)WPF?許多朋友也許會(huì)問(wèn):既然表示
7、層技術(shù)那么多,為什么還要推出WPF作為表示層技術(shù)呢?我 們?cè)捑W(xué)習(xí)WPF有什么收益和好處呢,這個(gè)問(wèn)題我們從兩個(gè)方而進(jìn)行回答。首先,只要開(kāi)發(fā)表示層程序就不可避免的要和4種功能性代碼打交道,他們分別是: 數(shù)據(jù)模型:現(xiàn)實(shí)世界中事物和邏輯的抽象。業(yè)務(wù)邏輯:據(jù)模型之間的關(guān)系和交互。用戶界面:由控件構(gòu)成,于用戶進(jìn)行交互的界而,用于把數(shù)據(jù)展示給用戶并響應(yīng)用戶輸入。界而邏輯,控件與控制之間的的關(guān)系和交互。這4種代碼的關(guān)系如圖2所示:業(yè)務(wù)邏輯jnr數(shù)據(jù)??赵诒3执a可維護(hù)性的前提下,如何讓數(shù)據(jù)能夠順暢的到達(dá)界而并靈活顯示,同時(shí)方便的接 收用戶操作,歷來(lái)是表示層開(kāi)發(fā)的核心問(wèn)題,為此,人們研究出了各種各樣的設(shè)計(jì)模
8、式,其 中經(jīng)久不衰的 MVC(ModelView-Controler)模式,MVP(Model-View-Presenter)模 式等。在WPF出現(xiàn)之前,Winform, A都采用”事件驅(qū)動(dòng)“理念,這種由”事件一訂閱一 事件處理器關(guān)系交織在一起構(gòu)成程序,盡管可以使用MVC, MVP模式,但一不小心就將界而邏輯和業(yè)務(wù)邏輯糾纏在了一起,造成代碼復(fù)朵難懂,Bug難以排除。ifn WPF則是微軟 在開(kāi)發(fā)理念上的一次升級(jí)-由”事件驅(qū)動(dòng)41變成了 數(shù)據(jù)驅(qū)動(dòng)蔦數(shù)據(jù)驅(qū)動(dòng)時(shí)代,用戶每進(jìn)行一個(gè)操作會(huì)激發(fā)程序發(fā)生一個(gè)事件,事件發(fā)生以后,用于響應(yīng)事 件的事件處理器就會(huì)執(zhí)行,事件處理器是一個(gè)方法(函數(shù)),在這個(gè)方法中,
9、程序員可以處理 數(shù)據(jù)或調(diào)用別的方法,這樣,程序就在事件的驅(qū)動(dòng)下向前執(zhí)行??梢?jiàn)事件驅(qū)動(dòng)的數(shù)據(jù)是靜態(tài) 的,被動(dòng)的;界而控件是主動(dòng)的,界而邏輯和業(yè)務(wù)邏輯之間的橋梁是事件。而數(shù)據(jù)驅(qū)動(dòng)正好 相反,當(dāng)數(shù)據(jù)發(fā)生改變的時(shí)候會(huì)主動(dòng)通知界而控件,推動(dòng)控件展示最新的數(shù)據(jù);同時(shí)用戶的 操作會(huì)直接送達(dá)數(shù)據(jù),就好像控件是”透明的??梢?jiàn),在數(shù)據(jù)驅(qū)動(dòng)理念里,數(shù)據(jù)占主導(dǎo)地位, 控件和控件事件被弱化(控件事件一般只參與界而邏輯,不再染指業(yè)務(wù)邏輯,使得程序復(fù)雜 度得到有效的控制)。WPF中,數(shù)據(jù)與控件的關(guān)系就是哲學(xué)中內(nèi)容與形式的關(guān)系,內(nèi)容決 定形式,所以數(shù)據(jù)驅(qū)動(dòng)界面,這非常符合哲學(xué)原理,數(shù)據(jù)與界而間的橋梁就是數(shù)據(jù)關(guān)聯(lián)(Data B
10、inding),通過(guò)這個(gè)橋梁,數(shù)據(jù)可以流向界而,再叢界而流向數(shù)據(jù)源。簡(jiǎn)而言之,WPF的開(kāi)發(fā)理念更符合口然哲學(xué)的思想。使用WPF進(jìn)行開(kāi)發(fā)較之Winform開(kāi) 發(fā)要簡(jiǎn)單,程序更加簡(jiǎn)潔清晰。其次,微軟將WPF理念擴(kuò)展到兒乎所有的開(kāi)發(fā)平臺(tái),包括桌而平臺(tái),瀏覽器平臺(tái),手機(jī)平 臺(tái)。WPF的完整版可以運(yùn)于在Windows下開(kāi)發(fā)下的桌而應(yīng)用程序(當(dāng)然,這些應(yīng)用程序也可以 在瀏覽器中運(yùn)行。)WPF的簡(jiǎn)化版Silveright,不但可以編寫(xiě)運(yùn)行于瀏覽器中的富客戶端程 序(Rich Internet Application),也可用于編寫(xiě)微軟手機(jī)平臺(tái)中的軟件,所以這些程序的開(kāi) 發(fā)理念都是一樣的,僅在類(lèi)庫(kù)方而有一些差
11、別,也就是說(shuō),學(xué)會(huì)WPF開(kāi)發(fā),Silveright和 Windows Phone軟件都可以觸類(lèi)旁觀,投入這些精力是值得的。WPF 之 XMAL-XMAL 概覽微軟為了把開(kāi)發(fā)模式從網(wǎng)絡(luò)開(kāi)發(fā)移植到桌而開(kāi)發(fā)和富媒體網(wǎng)絡(luò)程序的開(kāi)發(fā)上,微軟創(chuàng)造了一 種新的開(kāi)發(fā)語(yǔ)言XMAL(讀作 ZAML), XAML 全稱 Extensible Application MarkUp Languageo即可擴(kuò)展應(yīng)用程序標(biāo)記語(yǔ)言。它在做桌而開(kāi)發(fā)和富媒體網(wǎng)絡(luò)程序開(kāi)發(fā)中扮演 HTML+CSS+JS的角色,成為設(shè)計(jì)師和程序員溝通的樞紐?,F(xiàn)在設(shè)計(jì)師和程序員一起工作,共同維護(hù)軟件的版本,只是他們使用的軟件不一樣-設(shè)計(jì) 師使用Blen
12、d(Expression設(shè)計(jì)套件工具中的一個(gè))來(lái)設(shè)計(jì)UI,程序員使用Visual Studio開(kāi) 發(fā)后臺(tái)邏輯應(yīng)用代碼。Blend就像PhotoShop等設(shè)計(jì)工具,因此可以最大限度的發(fā)揮設(shè)計(jì) 師的特長(zhǎng)。使用它,設(shè)計(jì)師不僅可以設(shè)計(jì)岀絢麗多彩的UI,還可以讓UI上包含動(dòng)畫(huà)“雖 然程序員也可以做到這些,但從專業(yè)性,時(shí)間開(kāi)銷(xiāo)以及技術(shù)要求上顯然是劃不來(lái)的。更重要 的是,這些絢麗的UI動(dòng)畫(huà)都會(huì)以XMAL的形式直接保存進(jìn)項(xiàng)目,無(wú)需轉(zhuǎn)化就可以直接編譯, 節(jié)省了大量的時(shí)間和成本。XAML的優(yōu)點(diǎn):XAML可以設(shè)計(jì)出專業(yè)的UI和動(dòng)畫(huà)一好用。XAML不需要專業(yè)的編程知識(shí),它簡(jiǎn)單易懂、結(jié)構(gòu)清晰一易學(xué)。XAML能使設(shè)計(jì)師直
13、接參與軟件開(kāi)發(fā),隨時(shí)溝通、無(wú)需二次轉(zhuǎn)化一高效XAML這位翩翩君子的才華可遠(yuǎn)不止于這些??趶膽?yīng)用程序從控制臺(tái)界而(Console User lnterface,CUI)升級(jí)為圖形界而(Graphic User Interface)后,程序員們就一直追求視圖(View,即UI)和業(yè)務(wù)邏輯的分離。以往的開(kāi)發(fā)模式中, 程序員很難保證用來(lái)實(shí)現(xiàn)UI的代碼完全不與用來(lái)做業(yè)務(wù)邏輯處理的代碼糾纏在一起。UI代 碼和業(yè)務(wù)邏輯代碼糾纏在一起通稱為UI和邏輯的緊耦合,它往往帶來(lái)以下后果:無(wú)論是軟件的功能述是UI的設(shè)計(jì)有所變化或者是出現(xiàn)Bug,都將導(dǎo)致大量代碼的修改。會(huì)使得邏輯代碼更加難以理解修改往往比重寫(xiě)更困難,因?yàn)?/p>
14、在修改之前必須要先讀懂。重用邏輯代碼編程了 Mission Imposible。XAML的另外一個(gè)大優(yōu)點(diǎn)就是:它幫助開(kāi)發(fā)團(tuán)隊(duì)真正的實(shí)現(xiàn)了 UI和業(yè)務(wù)邏輯的剝離。XMAL是一種單純的聲明型語(yǔ)言,這就是說(shuō)它只能用來(lái)聲明一些UI元素、繪制UI和動(dòng)畫(huà)(在XMAL 中實(shí)現(xiàn)動(dòng)畫(huà)是不需要編程的),根本無(wú)法在其中加入程序邏輯,這就強(qiáng)制的把邏碌代碼從UI 中趕走了。這樣,與UI相關(guān)的元素統(tǒng)統(tǒng)集中在程序的UI層,與邏績(jī)相關(guān)的代碼統(tǒng)統(tǒng)集中在 業(yè)務(wù)邏輯層,形成了一種”高內(nèi)聚“低耦合的結(jié)構(gòu)。形成這種結(jié)構(gòu)后,無(wú)論是打算對(duì)UI進(jìn)行 較人的改動(dòng)述是打算重用底層邏輯,都不會(huì)花費(fèi)太大力氣,這就好比你某一天給A客戶做 了一個(gè)桔子,
15、A客戶很喜歡,A客戶將口己的產(chǎn)品介紹給B客戶,B客戶喜歡桔子的味道,但是希望它看上去像香蕉這時(shí)候,你只需要將桔子的皮撕下來(lái),換成香蕉的皮就可以了,只需要少星的成木就可以獲得和之前一樣大的收益(對(duì)于軟件的換膚功能,WPF提供了強(qiáng)大 的Template功能,將在后而詳述)WPF之從0開(kāi)始學(xué)習(xí)XMAL剖析最簡(jiǎn)單的XMAL代碼:html view plaincopyprint?1 .5. 6.7. .花花綠綠一大片,述有兩個(gè)像主頁(yè)地址的東西它們都是些什么呢,讓我們一個(gè)個(gè)來(lái)分析。XAML是由XML派生出來(lái)的語(yǔ)言,所以有很多在XML中的概念在XAML中是通用的。比 如使用標(biāo)簽聲明一個(gè)元素(每一個(gè)元素對(duì)應(yīng)內(nèi)
16、存中的一個(gè)對(duì)象)時(shí),需要使用其實(shí)標(biāo)簽vtab 和結(jié)束標(biāo)簽,夾在起始標(biāo)簽和終止標(biāo)簽中的XAML代碼表示隸屬于這個(gè)標(biāo)簽的內(nèi)容。 如果沒(méi)有什么類(lèi)容隸屬于這個(gè)標(biāo)簽,可以寫(xiě)為o為了表示同類(lèi)標(biāo)簽中的某個(gè)標(biāo)簽的與眾不同,可以給它的特征(Attribute)賦值。為特征賦 值的語(yǔ)法如下:非空標(biāo)簽:vtag Attribute1=value1 Attribute2=value2content空標(biāo)簽vtag Attribute1=value1 Attribute2=value2/在這里有必要把Attribute和Property仔細(xì)地辨別一下。這個(gè)詞的混淆由來(lái)已久,混淆的主要原因是大多數(shù)的中文譯文里即把Attri
17、bute譯為矚性J 也把Property譯為“屬性S其實(shí),這兩個(gè)詞表示的不是同一個(gè)層而上的東西。miProperty屬于而向?qū)ο蟮姆懂?。在使用而向?qū)ο缶幊痰臅r(shí)候,常常需要對(duì)客觀事物進(jìn)行捕象,在把抽象出來(lái)的結(jié)果封裝成類(lèi),類(lèi)中用來(lái)表示事物狀態(tài)的成員就是Propertyo比如要編寫(xiě)一個(gè)模擬賽車(chē)的游戲,那么必不可少的就是要對(duì)現(xiàn)實(shí)的賽車(chē)進(jìn)行抽象,現(xiàn)實(shí)中汽車(chē)會(huì)帶很多數(shù) 述會(huì)把汽車(chē)的加速,減速等行為提取出來(lái)用算法進(jìn)行模擬,這個(gè)過(guò)程就是屬于抽象(結(jié)果是據(jù),但是游戲中可能只關(guān)心它的長(zhǎng)度,寬度,高度,重量,速度等有限的幾個(gè)數(shù)據(jù),同時(shí),Car這個(gè)類(lèi))。顯然,Car.Length,Car.Height,Car.Wei
18、ght等表達(dá)的是當(dāng)前汽車(chē)所處的一個(gè) 狀態(tài),而Car.Accelerate。、Car.Break()表達(dá)的是汽車(chē)能做什么。因此,Car.Length,Car.Height就是Property的典型屬性,是針對(duì)對(duì)象而言的。將Property譯為“屬 性”也很貼切,總之一句話:Property屬性是針對(duì)對(duì)象而言的。Attribute則是編程語(yǔ)言文法層而的東酋。比如有兩個(gè)同類(lèi)語(yǔ)法的元素A和B,為了表示A與B不完全相同或者A與B的用法上有些區(qū)別,這時(shí)候就要針對(duì)A和B加一些Attributeo 也就是說(shuō)Attribute只與語(yǔ)言層而上的東西有關(guān),與抽象出來(lái)的對(duì)象沒(méi)有什么關(guān)系。因?yàn)锳ttribute是為了表
19、示“區(qū)分”的。所以它譯為41特征”。C#中的Attribute就是這種應(yīng)用的典型例子,我們可以為一個(gè)類(lèi)添加Attribute,這個(gè)類(lèi)里而有很多Property(屬性)。顯然,Attribute 只用來(lái)影響類(lèi)中程序中的用法,而Property則對(duì)應(yīng)著抽象對(duì)象身上的性狀,根本不是一個(gè) 層而上的東西。習(xí)慣上,英語(yǔ)中把標(biāo)簽式語(yǔ)言種表示個(gè)標(biāo)簽特征的14名-值”對(duì)稱做Attribute-如果恰好有在使用一種標(biāo)簽式語(yǔ)言做而向?qū)ο缶幊?,這兩個(gè)概念就有可能混在一起了。實(shí)際上,使用能 夠使用而向?qū)ο缶幊痰臉?biāo)簽式語(yǔ)言只是把標(biāo)簽和對(duì)象做了一個(gè)映射針對(duì)標(biāo)簽還是叫做Attribute,針對(duì)對(duì)象述是叫做Property,仍
20、然不是一個(gè)層而上的東西。而且,標(biāo)簽的Attribute 不是和對(duì)象的Property映射的,往往一個(gè)標(biāo)簽對(duì)于的Atrribute大于他所映射對(duì)象的Property o因?yàn)閄AML是用來(lái)在UI上繪制控件的,而控件本身就是面向?qū)ο蟮某橄螽a(chǎn)物,所以XAML 標(biāo)簽中的Atrribute有一大部分和它對(duì)應(yīng)他的對(duì)象的Property是 對(duì)應(yīng)的。當(dāng)然,這還意 味著標(biāo)簽中的Atrribute并不對(duì)應(yīng)它所代表對(duì)象的Property明口了 XAML的格式以及Atrribute和Property之間對(duì)應(yīng)的關(guān)系,對(duì)上而的代碼可謂是一目 了然。它的總體結(jié)構(gòu)是一個(gè)Window標(biāo)簽內(nèi)包含一個(gè)Grid標(biāo)簽(或者說(shuō)Grid標(biāo)簽
21、是Window 標(biāo)簽的內(nèi)容),所代表的內(nèi)容是一個(gè)Window對(duì)象里而包含一個(gè)Grid對(duì)象。html view plaincopyprint?1 .2. 3.3. 4. XAML是一種聲明式語(yǔ)言,當(dāng)你看見(jiàn)一個(gè)標(biāo)簽,就證明你聲明了一個(gè)對(duì)象,對(duì)象之間的關(guān)系 要么是并列,包含全都體現(xiàn)在標(biāo)簽的關(guān)系上。下而的代碼就是標(biāo)簽的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對(duì)象對(duì)應(yīng)的。中間兩行(即 兩個(gè)xmlns)實(shí)在聲明名稱空間。最上而一行是在使用名為class的Attribute,這個(gè)Attribute 來(lái)自于X:前綴所對(duì)應(yīng)的名稱空間。下面仔細(xì)解釋。前而已經(jīng)說(shuō)過(guò),XMAL語(yǔ)言是從XML語(yǔ)言派生而來(lái)的。XML有一個(gè)功能就是可以在XML 文檔的標(biāo)簽內(nèi)使用xmlns特征來(lái)定義名稱空間(NameSpace) , XML也就是 XML-NameSpace的縮寫(xiě)。定義名稱空間的好處就是,當(dāng)來(lái)源不同的類(lèi)重名時(shí),可以使用 名稱空間加以區(qū)分。xmlns特征的語(yǔ)法如下:html
23、view plaincopyprint?1 .xmlns:可選的映射前綴=“名稱空間Illxmlns后可以跟一個(gè)可選的映射前綴,之前用冒號(hào)隔開(kāi)。如果沒(méi)有寫(xiě)可選映射的前綴,那就意味著所有來(lái)口這個(gè)名稱空間的所有標(biāo)簽都不用加這個(gè)前綴,這個(gè)沒(méi)有映射的命名空間稱為 44默認(rèn)的命名空間J默認(rèn)名稱空間只能有一個(gè),而且應(yīng)該選擇其中使用最頻繁的名稱空間來(lái) 作為默認(rèn)命名空間。在上而的例子中,vWindow和vGrid來(lái)口于第二行聲明的默認(rèn)命名空 間,而第一樣的CLASS特征則來(lái)來(lái)口于三行的中x:前綴對(duì)應(yīng)的名稱空間。這里可以做一個(gè) 有趣的小實(shí)驗(yàn):如果給第二行聲明的名稱空間加一個(gè)前綴,例如m那么代碼必須要改成一 下形
24、式編譯才能通過(guò):html view plaincopyprint?1 .5. 6.6. 7. XAML中引用外來(lái)程序集和其中.NET名稱空間的語(yǔ)法和C#是不一樣的。在C#中,如果想使用System.Windows.Control名稱空間內(nèi)的Button類(lèi),需要先把包含System.W泊dows.Control名稱空間的程序集PresentationFramework.dll添加引用到項(xiàng)目中,然后再用C#代碼頂部寫(xiě)上一句:using System.Windows.Control;在XAML中做同樣的事情也需要添加對(duì)程序集的引用,然后再在根元素的起始標(biāo)簽中寫(xiě)上一 句:xmlns:c=”clrnam
25、espace:SystemWindowsC on trol;assembly=Presentatio nF rameworkHo c是映射的前綴,換成其它字符串也可以。因?yàn)閎utton來(lái)口前綴為c的命名空間,所以 在使用button的時(shí)候就要使用.o中有口動(dòng)提示功能。xmlns:c=Hclr- namespace:System Windows. C on trol;assemble=PresentationFrameworkH,這么長(zhǎng)的一串字符串看上去的確有點(diǎn)恐怖,但不用擔(dān)心,VS200在VS2008 A動(dòng)提示的頂部,你會(huì)看到幾個(gè)像網(wǎng)站地址的幾個(gè)名稱空間,其中就包含例子 代碼中的那兩行。為什么
26、名稱空間看上去想一個(gè)網(wǎng)站地址呢。其實(shí)把它c(diǎn)opy到瀏覽器地址 欄嘗試跳轉(zhuǎn)也不會(huì)打開(kāi)網(wǎng)頁(yè)。這里只是XAML解釋器的一個(gè)硬性編碼(hard-coding),只 要見(jiàn)到這些固定的字符串,就會(huì)把一系列的程序集和程序集中包含的名稱空間引入進(jìn)來(lái)。圖25 VS 2008的自動(dòng)提示功能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動(dòng)提示頂部的幾個(gè)名稱空間默認(rèn)引入的這兩個(gè)名稱空間格外的重要,它們對(duì)應(yīng)的程序集和met名稱空間如下: 對(duì)應(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;也就是說(shuō)你可以在XAML中可以直接使用這些CLR名稱空間下的類(lèi)型(因?yàn)槟J(rèn)XML名 稱空間前沒(méi)有前綴)。 則對(duì)應(yīng)一些與 XAML 語(yǔ)法和編譯相關(guān)的CLR名稱空間,使用這些名稱空間中的類(lèi)型需要加上前綴x,因?yàn)樗鼈儽挥成涞絰的XML 名稱空間中。從這兩個(gè)名稱空間的名字和它所對(duì)應(yīng)的.NET程序集上,這個(gè)不難看出,第一個(gè)空間名稱對(duì) 應(yīng)的是繪制UI相關(guān)的程序集,是表示(Presentation)層而上的東西;第二個(gè)名稱空間則對(duì)應(yīng) 著
30、XAML解析處理相關(guān)的程序集,是語(yǔ)言層面上的東西。還剩下 x:Class=WpfApplication2.Window2這個(gè) Attributeo x 前綴說(shuō)明這個(gè) Attribute 來(lái)著于X映射的名稱空間前而我們解釋過(guò),這個(gè)名稱空間對(duì)應(yīng)XAML解析功能的。x:Class, 顧名思義他與類(lèi)有一些關(guān)系,是何種關(guān)系呢,讓我們做一個(gè)有趣的實(shí)驗(yàn): 首先,x:Class=MWpfApplication2.Window2,f這個(gè) Attribute 刪掉,再到 Windows.xaml.cs 文件里,把構(gòu)造中對(duì)InitalizeComponent方法的調(diào)用也刪掉。編譯程序,你會(huì)發(fā)現(xiàn),程序依然可以運(yùn)行,為
31、什么呢?打開(kāi)App.xaml這個(gè)文件,你會(huì)發(fā)現(xiàn)這樣一個(gè)AttributeStartupUri=,Window1 .xaml1,是它告訴編譯器把 Windowl .xaml 作為程序啟動(dòng) 的主窗體。也就是說(shuō),只要Windowsl.Xaml能夠被解析為一個(gè)窗體,程序就能夠運(yùn)行。然后只恢復(fù) x:Class=nWpfApplication2.Window2f,這個(gè) Attribute(不恢復(fù) InitalizeComponent方法的調(diào)用)。編譯之后仍然可以運(yùn)行,這是使用IL Disassembled中間語(yǔ)言凡編譯器)打開(kāi)項(xiàng)目的編譯結(jié)果,你會(huì)發(fā)現(xiàn)在由項(xiàng)目編譯生成的程序集里而包含一個(gè)名為Window2的
32、類(lèi), 如下圖所示Il OtMisemblefMicrosoft Windows SDK vX)A Tools * Fusion Log ViewerInsUM Microsoft FXCop3 Manifest Generation and Editing圖27中間語(yǔ)當(dāng)反編譯器的位賈這說(shuō)明,XAML這個(gè)Attribute的作用是當(dāng)XAML解析器將它的標(biāo)簽解析成C#類(lèi)之后,這個(gè) 類(lèi)的類(lèi)名是什么。這里已經(jīng)觸碰到XAML的本質(zhì)。前面我們已經(jīng)看到,事例代碼的結(jié)構(gòu)就 是使用XAML語(yǔ)言直觀的告訴我們,當(dāng)前的窗體是一個(gè)Window里面嵌入了一個(gè)Grido 如果是使用C#完成同樣的設(shè)計(jì)呢?顯然,我們不可能去
33、更改Window這個(gè)類(lèi),我們能做的 是從Window派生一個(gè)類(lèi),再為這個(gè)類(lèi)添加一個(gè)Grid類(lèi)型的字段,然后把這個(gè)字段初始化 的時(shí)候賦值給派生類(lèi)的類(lèi)容屬性。代碼看起來(lái)大概是這樣:圖2-8項(xiàng)目編譯后生成的WindowABC類(lèi)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.最后讓讓我回到最初的代碼。你可能會(huì)問(wèn):在XAML里而有x:Class=WpfApplication2.Window2,*,在 Windows2.xaml.cs 里而也聲明了 Window2 這個(gè)類(lèi),難道他們不會(huì)沖突嗎?仔細(xì)看看Windows2.xaml.cs中Window2的聲明就知道了在聲明的時(shí)候使用的是partial關(guān)鍵字,這樣,這樣由XAML中解析成的類(lèi)和C#文件里而定義的部分就合二為1 了,正
36、是由于這種partial機(jī)制,我們可以把邏輯代碼留在cs文件里,用C#語(yǔ)言來(lái)實(shí)現(xiàn),而把那些聲明及布局UI元素的代碼分離出去,實(shí)現(xiàn)UI和邏銀分離,并且,用于繪制UI的代碼(如聲明控件類(lèi)型的字段,設(shè)置它們的外觀和布局等)也不必再使用C#語(yǔ)言,使用XAML和XAML編輯工具就可以輕松搞定。至此,你應(yīng)該對(duì)這個(gè)簡(jiǎn)單的XAML程序了然于胸了。WPF學(xué)習(xí)系統(tǒng)的學(xué)習(xí)XAML語(yǔ)法1, XAML文檔的樹(shù)形結(jié)構(gòu):UI在用戶眼里而是個(gè)平而結(jié)構(gòu)。如下圖所示,在用戶眼里看來(lái),這個(gè)界而就是一個(gè)窗體里而平鋪了 4個(gè)文木框和一個(gè)按鈕的界而。 Window2在傳統(tǒng)的 Visual C+、Delphi、Visual Basic6.
37、0 和 Windows Form 程序員的思維里,Ul 也是一個(gè)平而的結(jié)構(gòu)。因此,程序員要做的事情就是根據(jù)美工給的給定的UI布局把控件安 置在窗體的表而,并用使用長(zhǎng)度,寬度和間距把控件對(duì)齊。與傳統(tǒng)的設(shè)計(jì)思維不同,XAML使用樹(shù)形邏輯結(jié)構(gòu)來(lái)描述UI,下而是用來(lái)描述界而布局的XAML代碼:1.2.html view plaincopyprint?.8. 9. 10. 11. 12. 13. 14. 15. 16. 因?yàn)榇a中有許多對(duì)Attribute的屬性,所以結(jié)構(gòu)看起來(lái)并不是那么清晰。如果我們把對(duì)Attribute的賦值都去掉,那么上而的代碼就顯現(xiàn)了它的樹(shù)形框架結(jié)構(gòu)。 html v
38、iew plaincopyprint?1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 如果用一張圖來(lái)表示上而的那段代碼,它會(huì)是下而這個(gè)樣子有意思的是,針對(duì)一個(gè)“看上去一樣”的UI布局,XAML代碼不一定是唯一的。拿上而的 UI代碼布局來(lái)說(shuō),我們還可以使用不同的XAML代碼來(lái)描述它。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. 精簡(jiǎn)后的代碼是:html view plaincopyprint?1. 2. 3.4. 5. 6. 7. 8. Button9. 1111.11. 框架變成了如圖所示的樣子:1Window IWindowTextBox I | TextBox I I TextBoxTextBoxIextBoxl
40、extBoxTexBoxButtonImageButtonImage雖然兩段代碼對(duì)Ul的實(shí)現(xiàn)方式不同,但是框架都是樹(shù)形的,以Window對(duì)象為根節(jié)點(diǎn), 一層一層向下包含。這種樹(shù)形結(jié)構(gòu)對(duì)于WPF整個(gè)體系都具有非常重要的意義,它不但影響 著UI的布局設(shè)計(jì),還深刻的影響著WPF的屬性(Property)子系統(tǒng)和事件(Event)子系統(tǒng)等 方方而而。在實(shí)際的編程過(guò)程中,我們經(jīng)常要在這棵樹(shù)上進(jìn)行按名稱查找元素,獲取父/子 節(jié)點(diǎn)等操作,為了方便操作這棵樹(shù),WPF基木類(lèi)庫(kù)為程序員準(zhǔn)備了 VisualTreeHelper和 LogicTreeHelper兩個(gè)助手類(lèi)(Helper Class),同時(shí)還在一些重要
41、的基類(lèi)里封裝了一些專門(mén) 用于操作這棵樹(shù)的方法。你也許可能會(huì)問(wèn):既然有這么多方法可以實(shí)現(xiàn)同一個(gè)UI,到底應(yīng)該選擇哪一種方式來(lái)實(shí)現(xiàn)UI呢?實(shí)際上,設(shè)計(jì)師給出的UI布局是軟件的一個(gè)靜態(tài)快照(Static Snap),這個(gè)靜態(tài)快照加上用戶有可能動(dòng)態(tài)操作才能夠構(gòu)成選擇實(shí)現(xiàn)布局形式的完整依據(jù),拿上而兩段代碼 來(lái)說(shuō),如果你希望用戶在改變窗體大小后需要等比例縮小口己內(nèi)部控件的尺寸,那么你選 擇第二種,如果只希望控件在界而上做一個(gè)簡(jiǎn)單的排列,第一種足矣。2, XAML中為對(duì)象賦值的方法XAML是一種聲明性語(yǔ)言,XAML會(huì)為每一個(gè)標(biāo)簽創(chuàng)建一個(gè)與之對(duì)于的對(duì)象,對(duì)象創(chuàng)建之 后要對(duì)它的屬性進(jìn)行必要的初始化之后才有使用意
42、義。因?yàn)閄AML語(yǔ)言不能夠編寫(xiě)程序的 運(yùn)行邏輯,所以一份XAML文檔除了使用標(biāo)簽聲明對(duì)象就是初始化對(duì)象屬性了。注意:XAML中對(duì)對(duì)象賦值總共有兩種方法:A:使用字符串進(jìn)行簡(jiǎn)單賦值。:使用屬性元索(Property Element)進(jìn)行復(fù)雜賦值。我用一個(gè)vRectangle標(biāo)簽的Fill為例來(lái)介紹這兩種方法:2.1使用標(biāo)簽的Attribute為對(duì)象屬性賦值前面我們已經(jīng)知道,一個(gè)標(biāo)簽的Attribute有一部分與對(duì)象的Property對(duì)應(yīng), 標(biāo)簽里而的Fill這個(gè)AHribute就是這樣,他與Rectangle類(lèi)對(duì)象的Fill屬性對(duì)應(yīng),在MSDN 文檔庫(kù)里可以查詢到,Retangle類(lèi)的Fill類(lèi)
43、型是一個(gè)Brusho Brush是一個(gè)抽象類(lèi),凡是已Brush為基類(lèi)的類(lèi)都可以成為Fill的屬性值。Brush的派生類(lèi)有很多: SolidColorBrush:單色畫(huà)刷。 LinearGradientBrush: 性漸變畫(huà)刷。 RadialGradientBrush:徑向漸變畫(huà)刷。 ImageBrush:位圖畫(huà)刷。 DrawingBrush:矢暈圖畫(huà)刷。 VisualBrush:可視元素畫(huà)刷。下而這個(gè)例子是使用SolidColorBrsh和LinearGradientBrush兩種。我們先學(xué)習(xí)使用字符串對(duì)Attribute的簡(jiǎn)單賦值,假設(shè)我們的Rectangle只需要填充成單 一的藍(lán)色,那么我
44、們只需要簡(jiǎn)單的寫(xiě)成:html view plaincopyprint?1. 5. 6. 7. 運(yùn)行效果如下圖:我們看到,blue這個(gè)字符串最終被翻譯成了 SolidcolorBrush并賦值給了 Rectangle對(duì)象。換成C#代碼是這樣。csharp view plaincopyprint?1. SolidColorBrush brush = new SolidColorBrush();2. brush.Color = Colors.Blue;3. this.rectanglel.Fill = brush;需要注意的是,這種Attribute=Value的賦值時(shí),由于XAML語(yǔ)法有限,Val
45、ue只能是一個(gè)字符串值,這就引發(fā)了下而兩個(gè)問(wèn)題:A,如果一個(gè)類(lèi)可以使用XAML類(lèi)來(lái)進(jìn)行聲明,并允許它的的Property可以和它的Attribute互相映射,那就需要為這些Property準(zhǔn)備適當(dāng)?shù)霓D(zhuǎn)換機(jī)制。B,由于Value是個(gè)字符串,所以其格式復(fù)雜程度有限,盡管可以在轉(zhuǎn)換機(jī)制里而包含一定 的按格式解析字符串的功能以便轉(zhuǎn)換成較復(fù)雜的目標(biāo)對(duì)象,但這會(huì)讓最終的XAML使用者 頭疼不已,因?yàn)樗麄儾坏貌辉谝粋€(gè)沒(méi)有編碼輔助的情況下手寫(xiě)一個(gè)格式復(fù)雜的字符串來(lái)滿 足需求。第一個(gè)問(wèn)題的解決方式是使用TypeConverter類(lèi)的派生類(lèi),在派生類(lèi)里而重新 TypeConverter的一些方法,第二個(gè)問(wèn)題的解決辦法就是使用屬性元素(Property Element)。2.2使用TypeConverter類(lèi)將XAML標(biāo)簽的Attribute與對(duì)象的Property進(jìn)行映射注意本小節(jié)的例子對(duì)于初學(xué)者來(lái)說(shuō)理解起來(lái)比較難而且實(shí)用性不大,主要是為喜歡刨根問(wèn)底的WPF JF發(fā)人員準(zhǔn)備的,初學(xué)者可以跳過(guò)這一節(jié)。首先我們準(zhǔn)備一個(gè)類(lèi):c
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版微粒貸逾期8萬(wàn)元債權(quán)清收合同3篇
- 2025年度木工工藝技術(shù)專利授權(quán)使用合同4篇
- 2025年度個(gè)人助學(xué)貸款質(zhì)押擔(dān)保合同書(shū)4篇
- 四川省瀘州市納溪區(qū)納溪中學(xué)集團(tuán)校聯(lián)考2024-2025學(xué)年九年級(jí)上學(xué)期1月期末道德與法治試題(含答案)
- 2025版小學(xué)校租賃合同附加文化活動(dòng)舉辦協(xié)議2篇
- 二零二五年度木結(jié)構(gòu)建筑清包施工合同書(shū)7篇
- 安徽省黃山市高三年級(jí)第二次質(zhì)量檢測(cè)語(yǔ)文試題(含答案)
- 2025版新型環(huán)保材料木材采購(gòu)合同模板4篇
- 2025年度個(gè)人合同糾紛解決欠款合同模板4篇
- 第三節(jié)預(yù)防策略與措施流行病學(xué)16課件講解
- 二零二五年度無(wú)人駕駛車(chē)輛測(cè)試合同免責(zé)協(xié)議書(shū)
- 2025年湖北華中科技大學(xué)招聘實(shí)驗(yàn)技術(shù)人員52名歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 高三日語(yǔ)一輪復(fù)習(xí)助詞「と」的用法課件
- 毛渣采購(gòu)合同范例
- 2023中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)-注射相關(guān)感染預(yù)防與控制
- 五年級(jí)上冊(cè)小數(shù)遞等式計(jì)算200道及答案
- 2024年廣東高考政治真題考點(diǎn)分布匯 總- 高考政治一輪復(fù)習(xí)
- 燃?xì)夤艿滥甓葯z驗(yàn)報(bào)告
- GB/T 44052-2024液壓傳動(dòng)過(guò)濾器性能特性的標(biāo)識(shí)
- 國(guó)際市場(chǎng)營(yíng)銷(xiāo)環(huán)境案例分析
- 滑雪指導(dǎo)員理論考試復(fù)習(xí)題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論