日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

深入浅出WPF(2)——解剖最简单的GUI程序

發(fā)布時間:2024/4/17 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出WPF(2)——解剖最简单的GUI程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
深入淺出WPF2——解剖最簡單的GUI程序 小序: 從這篇文章開始,我們進(jìn)行XAML語言的上手學(xué)習(xí)。說實話,XAML這種語言一點也不難。如果把XML看成是父類,那么XAML就是XML的一個派生類了,所以XML的概念在XAML中是通用的。What?你不了解XML?沒關(guān)系,反正我們是從頭開始! 正文: 你還能想起學(xué)C/C++的時候?qū)懙牡谝粋€程序嗎?呵呵,一定是“Hello World”吧!今天我們來解析一個“Hello WPF”。準(zhǔn)備好了嗎?Let's go 準(zhǔn)備知識 使用VS2008新建一個WPF Application,你立刻就會得到一個看上去是的窗體。窗體這個東西,在Windows Form程序里叫“Form”,在WPF里叫Window”——喔,Win32 API里也叫Window!是的,你說對了,WPF在某種程度上是向Win32 API返璞歸真 為什么說它看上去是空的呢?實際上,這個Window的內(nèi)部有一個叫<Grid>元素(Element,只是這個元素是看不見的,它就像信紙上的暗格一樣。 針對XAML文件,是可以進(jìn)行所見即所得的可視化設(shè)計的。你在XAML代碼上做的修改,只要是合乎語法的,那么在設(shè)計器里就會立刻反映出來(有時候需要刷新一下)。如果你發(fā)現(xiàn)設(shè)計器里顯示不出來了,那一定是XAML語句出了問題,最好想辦法修正它。不然的話,在設(shè)計器里都看不到效果、只能運行起來看,這還算什么可視化編程呢?要XAML還有什么意義呢? 在我們正式剖析代碼之前,讓我們牢記兩件事: 1.?????這個世界是一個組合的世界——汽車是由一個車身和四個輪子組合成的;飛機(jī)是由機(jī)翅和機(jī)身組合成的。這些組成部分,我們稱之為元素(Element 2.?????XAML文件里,每寫一個元素就相當(dāng)于定義了一個元素所對應(yīng)的.NET Framework類的實例。 有必要強(qiáng)調(diào)一點:如果一個實體是由一些(同類或者不同類的)子對象組合成的,我們就稱這個實體為父元素、稱這些子對象為子元素,因為父元素包含著子元素,所以常把父元素稱為包含元素、把子元素稱為被包含元素或父元素的內(nèi)容”——我們需要注意,被包含元素并不等同于包含元素的屬性(property),被包含元素只是包含元素的一個部分??初聽這句話,肯定是一頭霧水,OK,讓我舉個兩個例子。比如有一個班級,這個班由56個學(xué)生、1個老師、60張桌子、70把椅子組成,那么這些學(xué)生、老師、桌子和椅子,只是這個班級的一些組成部分;而這個班級的人數(shù)、班級隸屬的年級、班級的編號是這個班級的屬性。再比如我有一個Window,這個Window里有1Grid,這個Grid里又包含著3TextBox2Button,那么這1Grid就是這個Window的子元素,3TextBox2Button又是Grid的子元素;而WindowNameIcon、尺寸乃至Resources都是這個Window的屬性。 你可能會問,這個道理這么簡單,有什么好強(qiáng)調(diào)的呀? 原因是這樣的:對于C#的類而言,屬性(property)肯定是一個對象(比如WindowName屬性,它就是一個String類型的對象),這個對象也是類實例的一個組成部分;而在對這個類進(jìn)行擴(kuò)展的時候(對這個類進(jìn)行派生),我們新添加進(jìn)來的元素(比如3TextBox2Button)也是類實例的組成部分。OK,大家看到了,從現(xiàn)實世界抽象到編程世界來之后,它們的區(qū)別就不那么鮮明了。為了再讓它們的區(qū)別鮮明起來,請大家記住兩句話:
  • 屬性對象(元素)是父元素所固有的,子元素則可由設(shè)計人員來進(jìn)行增減
  • 屬性對象(元素)是隸屬于父類的(從父類繼承而來),子元素是在設(shè)計派生類時新添加進(jìn)來的
之所以在剖析代碼之前講述這些東西,是因為XAML是一種XML語言,它的語法完全是元素嵌套組合式的,而屬性和子元素也都是類實例的組合體,如果不先分清楚,讀代碼的時候一定會感覺混亂。 ?在了解了這些內(nèi)容之后,我們就可以放心地讀代碼了。 剖析代碼 ?請新建一個名為HelloWPFWPF Application項目。在XAML語言編輯器里,你會看到和下面一樣的代碼。 ??<Window?x:Class="HelloWPF.Window1"
????xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
????xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
????Title
="Window1"?Height="300"?Width="300">
????
<Grid>
????????
????
</Grid>
</Window> ?讓我們一個詞一個詞地分析這段代碼。 就像我們遇到復(fù)雜長句時先要分析它的主干一樣——讓我們暫時拋開花花綠綠的代碼,看看這段程序的主干是什么。喔~~~這段程序的主干是如此的簡單!就是一個<Window>元素里包含著一個?<Grid>元素。 ??<Window>
????
<Grid>
????????
????
</Grid>
</Window> ?一個句子的主干找出來之后,句子的大意也就明白了。我們已經(jīng)得到這段程序的主干了,那這段程序說的是什么呢?前面我叮囑大家一定要記住兩件事件。其中一件就是見到元素就相當(dāng)于創(chuàng)建實例。我想你一定會說:這段程序就是在定義一個Window類的實例,這個實例的一個組成部分是一個Grid類的實例。 呵呵,對于這個答案,既可以說它是對的,也可以說它是錯的,為什么呢? 請注意,Window元素的一個attributex:Class="HelloWPF.Window1",這個Class就是在告訴我們嘿!本XAML文件實際上是這個類的UI部分哦!。本例中,類名就是等號后面的“HelloWPF.Window1”,也就是說,是HelloWPF名稱空間中的Window1這個類。在項目瀏覽器中找到與這個XAML文件配套的C#文件(XAML文件名.cs),果然能找到這個類。 ??public?partial?class?Window1?:?Window
????{
????????
public?Window1()
????????{
????????????InitializeComponent();
????????}
????}
從這個角度來看,上面的答案就是錯的了——因為這段代碼是在定義一個Window1的實例會是什么樣子。 那為什么又可以說它的對的呢?顯然,Window1Window類的派生類,根據(jù)多態(tài)的原理,你說Window1“是一個”Window并沒有錯——就像你說鴨子是一只鳥一樣正確。在派生過程中,我們使用<Grid>標(biāo)簽為它添加了一個Grid類型的UI成員——派生嗎,一定是要做些擴(kuò)展的。 看到這兒,我想你已經(jīng)猜到了,XAML文件就是用來定義Window1這個類的UI部分(一旦這個類創(chuàng)建了實例,那這個實例的UI將與XAML代碼的描述相一致)。微軟通過XAML語言把UI設(shè)計完全暴露給了我們,讓設(shè)計師可以像設(shè)計網(wǎng)頁一樣來設(shè)計桌面程序的界面。至于這個類的邏輯部分,還是用傳統(tǒng)的C#語言來實現(xiàn)。這樣,設(shè)計人員和開發(fā)人員就能各司其職、協(xié)同工作了。 一個類能夠掰成兩半來寫,這要歸功于partial這個關(guān)鍵字,使用這個關(guān)鍵字,可以把一個類的代碼分散在多處來實現(xiàn)。可問題又來了——XAML代碼怎么和C#代碼對接啊?呵呵,這個還真不用咱們操心,微軟的XAML解析器本著進(jìn)村悄悄地,開槍地不要原則,在背后把這件事完成了。因為XAML代碼中沒有邏輯,所以,解析XAML的大部分工作就是按照元素標(biāo)簽的描述把對象創(chuàng)建出來——比如,解析器見到有<Grid>標(biāo)簽出現(xiàn),就會生成與C#代碼new Grid()等價的代碼。 喘口氣兒……
讓我們繼續(xù)。 XAML名稱空間 如果你問一個初學(xué)XAML的人(碰巧他還沒有XML編程經(jīng)驗):最讓他迷惑的是什么?我想他會告訴是:就是那個x老實講,我就是他們中的一員,初學(xué)的時候我也很痛恨那個x。一會兒是“:x”,一會兒是“x:”……這個x到底是什么呢? 其實非常簡單——這個x是一個名稱空間、一個使用XML語法聲明的名稱空間。只是XML語言聲明名稱空間的時候語法比較怪而已。下面,讓我一一為你解釋。 首先,如果你使用C#,那么你對這幾句代碼一定不陌生:


這是對.NET Framework類庫中名稱空間的引用。一旦引用了這些名稱空間,在使用這些名稱空間中的類時就不并在再類名前加上長長的前綴了。 請大家考慮這樣一種情況:有兩個很長的名稱空間,我需要使用它們中的類,但不巧的是這兩個名稱空間里的類又有很多是重名的……怎么辦呢?呵呵,我們可以使用名稱空間的別名來解決這個問題: using?Software?=?Microsoft.Google.Adobe.RedHat.CA;
using?Hardware?=?IBM.Sun.RedHat.Dell.Lenovo.HP.Oracle;
這樣,即解決了輸入字符過多的問題,又解決了類名沖突的問題:
Software.Company?c1?=?new?Software.Company();
Hardware.Company?c2?
=?new?Hardware.Company();
XAML名稱空間跟C#的名稱空間別名類似,但不完全一樣。先讓我們看那個xx其實就是一個簡寫的名稱空間啦!xmlns就是XML Namespace的簡寫,意思是要聲明一個名稱空間。 xmlns:x="[url]http://schemas.microsoft.com/winfx/2006/xaml[/url]" 這句話的意思就是:聲明一個名為x的名稱空間(xmlns與名稱空間的名字間用冒號隔開)。后面為什么要跟一個網(wǎng)址呢?呵呵,我們都被騙了——那根本不是一個網(wǎng)址,不信你用IE試試。其實,它就是一個普通的字符串,你盡可以把它當(dāng)成“Microsoft.WinFX.XAML”來理解。但值得注意的一點是:這個字符串不只代表著一個名稱空間,而是代表了一組名稱空間,這組名稱空間合稱“XAML語言空間”——因此,它的名字是x。換句話說,這個x相當(dāng)于一下子引用了好幾個名稱空間進(jìn)來,這幾個名稱空間在.NET Framework里都能查到,包含這些名稱空間里的類都是與XAML語言的語法、特性、功能有關(guān)的。 XAML中,想使用某個名稱空間里的類就要使用名稱空間+冒號+類名的格式,所以:
x:Class的意思是使用x名稱空間里名為Class的類。類似地,以后我們還會看到x:Staticx:Typex:XData等等,這都是在使用x這個名稱空間里的類。 與聲明x名稱空間類似,這兒還有一句:
xmlns="[url]http://schemas.microsoft.com/winfx/2006/xaml/presentation[/url]" 這回的網(wǎng)址與前面的不一樣,最后一個詞是“presentation”,顧名思義,這回引用進(jìn)來的一組名稱空間一定是與顯示相關(guān)的。說對了!比如System.Window.Control這個.NET Framework的名稱空間就包含在里面,這個名稱空間里幾乎包含了所有WPFUI元素(WPF里,我們稱控件為UI元素)。? 你可能會問:這不是在聲明名稱空間嗎!名字哪兒去了?
問的非常好!當(dāng)xmlns后面沒有跟隨名稱空間的名字時,就相當(dāng)于省去了名稱空間的名字,當(dāng)使用這個名稱空間中的類時就無需再加前綴(根本沒前綴可加,怎么加?)。換句話說,當(dāng)一個類名前面沒有前綴時,默認(rèn)就是此名稱空間里的類。因此,它稱為默認(rèn)名稱空間。這個用法跟using?System差不多。BTW:默認(rèn)名稱空間只能有一個。 大家可以動手試試這樣做,把xmlns="[url]http://schemas.microsoft.com/winfx/2006/xaml/presentation[/url]"改成xmlns:n="[url]http://schemas.microsoft.com/winfx/2006/xaml/presentation[/url]",??這時候程序就編譯不過去了。當(dāng)你把后面的<Grid>元素改成<n:Grid></n:Grid>后,就又可以通過編譯了。 ?最后,Title="Window1"?Height="300"?Width="300"的意思是設(shè)置Window1類(也可以說是Window類)的幾個實例屬性。這種語法稱為使用標(biāo)簽的attribute設(shè)置對象的property”,碰巧,attributeproperty這兩個詞都被譯為了屬性,所以這句話就沒法翻譯了。除了使用attribute設(shè)置對象property的語法外,XAML還支持使用子元素方式設(shè)置元素屬性的語法。下面這段代碼與原代碼是等價的: <Window?x:Class="HelloWPF.Window1"
????xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
????xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml">
????
<Window.Title>Window1</Window.Title>
????
<Window.Height>300</Window.Height>
????
<Window.Width>300</Window.Width>
????
<Grid>
????????
????
</Grid>
</Window>?
大家注意啦!<Window.Title><Window.Height><Window.Width>叫做屬性元素,表示它雖然是一個子元素,但它是父元素的一個屬性;而<Grid>則是一個普通元素,而非<Window>元素的屬性——它們雖然都是<Window>的組成元素,但不是一個圈子里的(請?zhí)D(zhuǎn)到上面,看看準(zhǔn)備知識)。總有初學(xué)者問我:反正Title也是Window的一個組成部分,能不能寫成<Title>Window1</Title>啊?幽默點講,XAML解析器沒那么聰明;地道的說法是,從物理上講,并沒有<Title>這個UI元素;從XAML語法上講,這樣會造成語義上的含混、遠(yuǎn)不及<Window.Title>來得清晰。 啰嗦一句:當(dāng)對象的property用一個簡單的string就能描述清楚時,完全沒必要使用子元素式語法小題大作。當(dāng)對象的屬性是一個復(fù)雜的對象時(你想用attribute式語法都辦不到),再使用子元素式語法。 到此,一個最簡單的WPF程序(的XAML部分)就算分析完了。本文成于倉促,之間有不少不嚴(yán)謹(jǐn)?shù)牡胤?#xff0c;我會慢慢修改。大家有什么好的建議,請在文后蓋樓。 ~~~看來今天是Hello不了WPF鳥,以后再說吧~~~ ?








本文轉(zhuǎn)自 水之真諦 51CTO博客,原文鏈接:http://blog.51cto.com/liutiemeng/95263,如需轉(zhuǎn)載請自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的深入浅出WPF(2)——解剖最简单的GUI程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。