WPF XAML 从零开始认识XAML
來自:http://blog.csdn.net/aoshilang2249/article/details/44158403
?剖析最簡(jiǎn)單的XMAL代碼:
[html]?view plain?copy
? ? ? ? 花花綠綠一大片,還有兩個(gè)像主頁地址的東西....它們都是些什么呢,讓我們一個(gè)個(gè)來分析。
???XAML是由XML派生出來的語言,所以有很多在XML中的概念在XAML中是通用的。比如使用標(biāo)簽聲明一個(gè)元素(每一個(gè)元素對(duì)應(yīng)內(nèi)存中的一個(gè)對(duì)象)時(shí),需要使用起始標(biāo)簽<tab>和結(jié)束標(biāo)簽</tag>,夾在起始標(biāo)簽和終止標(biāo)簽中的XAML代碼表示隸屬于這個(gè)標(biāo)簽的內(nèi)容。如果沒有什么內(nèi)容隸屬于這個(gè)標(biāo)簽,則這個(gè)標(biāo)簽稱為空標(biāo)簽,可以寫為<tag/>。
? ? 為了表示同類標(biāo)簽中的某個(gè)標(biāo)簽的與眾不同,可以給它的特征(Attribute)賦值。為特征賦值的語法如下:
? ? 非空標(biāo)簽:<tag Attribute1=value1 Attribute2=value2>content</tag>
? ? 空標(biāo)簽<tag Attribute1=value1 Attribute2=value2/>
? ? 在這里有必要把Attribute和Property仔細(xì)地辨別一下。
? ? 這個(gè)詞的混淆由來已久,混淆的主要原因是大多數(shù)的中文譯文里即把Attribute譯為“屬性”,也把Property譯為“屬性”,其實(shí),這兩個(gè)詞表示的不是同一個(gè)層面上的東西。
? ??Property屬于面向?qū)ο蟮姆懂?/span>。在使用面向?qū)ο缶幊痰臅r(shí)候,常常需要對(duì)客觀事物進(jìn)行抽象,在把抽象出來的結(jié)果封裝成類,類中用來表示事物狀態(tài)的成員就是Property。比如要編寫一個(gè)模擬賽車的游戲,那么必不可少的就是要對(duì)現(xiàn)實(shí)的賽車進(jìn)行抽象,現(xiàn)實(shí)中汽車會(huì)帶很多數(shù)據(jù),但是游戲中可能只關(guān)心它的長(zhǎng)度,寬度,高度,重量,速度等有限的幾個(gè)數(shù)據(jù),同時(shí),還會(huì)把汽車的加速,減速等行為提取出來用算法進(jìn)行模擬,這個(gè)過程就是屬于抽象(結(jié)果是Car這個(gè)類)。顯然,Car.Length,Car.Height,Car.Weight等表達(dá)的是當(dāng)前汽車所處的一個(gè)狀態(tài),而Car.Accelerate()、Car.Break()表達(dá)的是汽車能做什么。因此,Car.Length,Car.Height就是Property的典型屬性,是針對(duì)對(duì)象而言的。將Property譯為“屬性”也很貼切,總之一句話:Property屬性是針對(duì)對(duì)象而言的。
? ??Attribute則是編程語言文法層面的東西。比如有兩個(gè)同類語法的元素A和B,為了表示A與B不完全相同或者A與B的用法上有些區(qū)別,這時(shí)候就要針對(duì)A和B加一些Attribute。也就是說Attribute只與語言層面上的東西有關(guān),與抽象出來的對(duì)象沒有什么關(guān)系。因?yàn)锳ttribute是為了表示“區(qū)分”的。所以它譯為“特征”。C#中的Attribute就是這種應(yīng)用的典型例子,我們可以為一個(gè)類添加Attribute,這個(gè)類里面有很多Property(屬性)。顯然,Attribute只用來影響類中程序中的用法,而Property 則對(duì)應(yīng)著抽象對(duì)象身上的性狀,根本不是一個(gè)層面上的東西。
? ? 習(xí)慣上,英語中把標(biāo)簽式語言中表示一個(gè)標(biāo)簽特征的“名----值”對(duì)稱做Attribute。如果恰好有在使用一種標(biāo)簽式語言做面向?qū)ο缶幊?#xff0c;這兩個(gè)概念就有可能混在一起了。實(shí)際上,使用能夠使用面向?qū)ο缶幊痰臉?biāo)簽式語言只是把標(biāo)簽和對(duì)象做了一個(gè)映射-----針對(duì)標(biāo)簽還是叫做Attribute,針對(duì)對(duì)象還是叫做Property,仍然不是一個(gè)層面上的東西。而且,標(biāo)簽的Attribute不是和對(duì)象的Property一一映射的,往往一個(gè)標(biāo)簽對(duì)于的Atrribute大于他所映射對(duì)象的Property。
? ? 因?yàn)閄AML是用來在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)簽(或者說Grid標(biāo)簽是Window標(biāo)簽的內(nèi)容),所代表的內(nèi)容是一個(gè)Window對(duì)象里面包含一個(gè)Grid對(duì)象。
? ??XAML是一種聲明式語言,當(dāng)你看見一個(gè)標(biāo)簽,就證明你聲明了一個(gè)對(duì)象,對(duì)象之間的關(guān)系要么是并列,包含全都體現(xiàn)在標(biāo)簽的關(guān)系上。
下面的代碼就是<Window>標(biāo)簽的Atrribute。
[html]?view plain?copy
? ? ?其中Title、Width、Height一看就知道和Window的Property對(duì)象對(duì)應(yīng)的。中間兩行(即兩個(gè)xmlns)是在聲明名稱空間。最上面一行是在使用名為class的Attribute, 這個(gè)Attribute來自于X:前綴所對(duì)應(yīng)的名稱空間 。下面仔細(xì)解釋。
? ? 前面已經(jīng)說過,XMAL語言是從XML語言派生而來的。XML有一個(gè)功能就是可以在XML文檔的標(biāo)簽內(nèi)使用xmlns特征來定義名稱空間(NameSpace),XML也就是XML--NameSpace的縮寫。定義名稱空間的好處就是,當(dāng)來源不同的類重名時(shí),可以使用名稱空間加以區(qū)分。xmlns特征的語法如下:
[html]?view plain?copy
? ? ??xmlns后可以跟一個(gè)可選的映射前綴,之間用冒號(hào)隔開。如果沒有寫可選映射的前綴,那就意味著所有來自這個(gè)名稱空間的所有標(biāo)簽都不用加這個(gè)前綴,這個(gè)沒有映射的命名空間稱為“默認(rèn)的命名空間”,默認(rèn)名稱空間只能有一個(gè),而且應(yīng)該選擇其中使用最頻繁的名稱空間來作為默認(rèn)命名空間。在上面的例子中,<Window>和<Grid>來自于第二行聲明的默認(rèn)命名空間,而第一樣的CLASS特征則來來自于三行的中x:前綴對(duì)應(yīng)的名稱空間。這里可以做一個(gè)有趣的小實(shí)驗(yàn):如果給第二行聲明的名稱空間加一個(gè)前綴,例如n,那么代碼必須要改成一下形式編譯才能通過:
[html]?view plain?copy
? ?? ?XAML中引用外來程序集和其中.NET名稱空間的語法和C#是不一樣的。在C#中,如果想使用System.Windows.Control名稱空間內(nèi)的Button類,需要先把包含System.Windows.Control名稱空間的程序集PresentationFramework.dll添加引用到項(xiàng)目中,然后再用C#代碼頂部寫上一句:using System.Windows.Control;。
在XAML中做同樣的事情也需要添加對(duì)程序集的引用,然后再在根元素的起始標(biāo)簽中寫上一句:xmlns:c="clr-namespace:System.Windows.Control;assembly=PresentationFramework"。c是映射的前綴,換成其它字符串也可以。因?yàn)閎utton來自前綴為c的命名空間,所以在使用button的時(shí)候就要使用<c:Button>....</c:Button>。
? ? xmlns:c="clr-namespace:System.Windows.Control;assemble=PresentationFramework",這么長(zhǎng)的一串字符串看上去的確有點(diǎn)恐怖,但不用擔(dān)心,VS中有自動(dòng)提示功能。
在VS自動(dòng)提示的頂部,你會(huì)看到幾個(gè)像網(wǎng)站地址的幾個(gè)名稱空間,其中就包含例子代碼中的那兩行。為什么名稱空間看上去像一個(gè)網(wǎng)站地址呢。其實(shí)把它c(diǎn)opy到瀏覽器地址欄嘗試跳轉(zhuǎn)也不會(huì)打開網(wǎng)頁。這里只是XAML解釋器的一個(gè)硬性編碼(hard-coding),只要見到這些固定的字符串,就會(huì)把一系列的程序集和程序集中包含的名稱空間引入進(jìn)來。
? ? 默認(rèn)引入的這兩個(gè)名稱空間格外的重要,它們對(duì)應(yīng)的程序集和.net名稱空間如下:
? ? http://schemas.microsoft.com/winfx/2006/xaml/presentation對(duì)應(yīng):
[html]?view plain?copy
? ? ?也就是說你可以在XAML中可以直接使用這些CLR名稱空間下的類型(因?yàn)槟J(rèn)XML名稱空間前沒有前綴)。
? ??
? ? http://schemas.microsoft.com/winfx/2006/xaml則對(duì)應(yīng)一些與XAML語法和編譯相關(guān)的CLR名稱空間, 使用這些名稱空間中的類型需要加上前綴x,因?yàn)樗鼈儽挥成涞絰的XML名稱空間中。
? ? 從這兩個(gè)名稱空間的名字和它所對(duì)應(yīng)的.NET程序集上,這個(gè)不難看出,第一個(gè)空間名稱對(duì)應(yīng)的是繪制UI相關(guān)的程序集,是表示(Presentation)層面上的東西;第二個(gè)名稱空間則對(duì)應(yīng)著XAML解析處理相關(guān)的程序集,是語言層面上的東西。
? ? ?最后讓讓我回到最初的代碼。你可能會(huì)問:在XAML里面有x:Class="MyFirstApplication.MainWindow",在MainWindow.xaml.cs里面也聲明了MainWindow這個(gè)類,難道他們不會(huì)沖突嗎?仔細(xì)看看MainWindow.xaml.cs中MainWindow的聲明就知道了----在聲明的時(shí)候使用的是partial關(guān)鍵字,這樣,這樣由XAML中解析成的類和C#文件里面定義的部分就合二為一了,正是由于這種partial機(jī)制,我們可以把邏輯代碼留在.cs文件里,用C#語言來實(shí)現(xiàn),而把那些聲明及布局UI元素的代碼分離出去,實(shí)現(xiàn)UI和邏輯分離,并且,用于繪制UI的代碼(如聲明控件類型的字段,設(shè)置它們的外觀和布局等)也不必再使用C#語言,使用XAML和XAML編輯工具就可以輕松搞定。
參考《深入淺出WPF》
總結(jié)
以上是生活随笔為你收集整理的WPF XAML 从零开始认识XAML的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# list转为json_C#中Lis
- 下一篇: 深入浅出WPF之Binding的使用(二