XAML語法

2.1 新建WPF項目 ### 略

2.2 剖析最簡單的XAML代碼

XAML是XML派生的

為了表示同類標(biāo)簽中的某個標(biāo)簽與眾不同创译,可以給它的特征(Attribute)賦值默蚌,賦值語法如下:

非空標(biāo)簽:<Tag Attribute1=Value1 Attribute2=Value2>Content</Tag>

空標(biāo)簽:

Property和Attribute的區(qū)別

Property屬于面向?qū)ο罄碚摲懂犠7校愔杏脕肀硎臼挛餇顟B(tài)的成員就是Property。

Attribute則是編程語言文法層面的東西塔橡,Attribute只與語言層面上的東西相關(guān)裆馒,與抽象出來的對象沒什么關(guān)系。

xmlns是XML-Namespace的縮寫凡桥,語法為:

xmlns[:可選的映射前綴]=”名稱空間”

xmlns后面可以跟一個可選的映射前綴蟀伸,用冒號分隔。如果沒有使用可選的映射前綴缅刽,那就意味著所有來自這個名稱控件的標(biāo)簽都不用加前綴啊掏,這個沒有映射前綴的名稱空間稱為”默認(rèn)名稱空間”----默認(rèn)名稱空間只能有一個。

XAML中引用外來程序集和其中.NET名稱空間語法與C#不一樣衰猛。如果要添加System.Windows.Controls名稱空間里的Button類迟蜜,在XAML中首先需要添加對指定程序集的引用,然后在根元素的起始標(biāo)簽中添加如下代碼:xmlns:c=”clr-namespace:System.Windows.Controls;assembly=PresentationFramework”啡省。

c是映射前綴娜睛,換成其他字符也是可以的。因為這里Button來自前綴c對應(yīng)的名稱空間卦睹,所以使用Button的時候要寫成

第三章 系統(tǒng)學(xué)習(xí)XAML語法

3.1 XAML文檔的樹形結(jié)構(gòu)

在用戶眼中UI是一個平面的結(jié)構(gòu)畦戒。

在傳統(tǒng)的VC++、Delphi结序、VB或者WinForm程序員的思維中障斋,UI也是一個平面結(jié)構(gòu)。

XAML用樹形邏輯結(jié)構(gòu)來描述UI徐鹤。

WPF基本類庫為程序員準(zhǔn)備了VisualTreeHelper和LogicalTreeHelper兩個助手類垃环。

選擇哪種方法實現(xiàn)UI的依據(jù):

設(shè)計師在XAML上給出UI的布局是軟件的一個靜態(tài)快照(Static Snap),這個靜態(tài)快照需要加上用戶有可能執(zhí)行的動態(tài)操作才能構(gòu)成選擇布局實現(xiàn)方法的完整依據(jù)返敬。

3.2 XAML中為對象屬性賦值的語法

XAML中為對象屬性賦值共有兩種語法:

使用字符串進(jìn)行簡單賦值

使用屬性元素(Prperty Element進(jìn)行復(fù)雜賦值)

3.2.1 使用標(biāo)簽的Attribute為對象屬性賦值

使用Attribute=Value語法賦值的時候遂庄,由于XAML的語法限制,Value只可能是一個字符串救赐,這就引出了兩個問題:

如果一個類能使用XAML語言進(jìn)行聲明涧团,并允許它的property與XAML標(biāo)簽的Attribute互相映射只磷,那就需要為這些Property準(zhǔn)備適當(dāng)?shù)霓D(zhuǎn)換機(jī)制经磅。

由于Value是一個字符串泌绣,所有其格式復(fù)雜程度有限,盡管可以在轉(zhuǎn)換機(jī)制里包含一定的按格式解析字符串的功能以便轉(zhuǎn)換成較復(fù)雜的目標(biāo)對象预厌,但這會讓最終的XAML使用者頭痛不已阿迈。因為他們不得不在沒有編碼輔助的情況下手寫一個格式復(fù)雜的字符串以滿足賦值要求。

第一個問題的解決方案是使用TypeConverter類的派生類轧叽,在派生類里重寫TypeConverter的一些方法苗沧,第二個問題解決辦法是使用屬性元素(Property Element)。

3.2.2 使用TypeConverter類將XAML標(biāo)簽的Attribute與對象的Property進(jìn)行映射

略 見書P19

3.2.3 屬性元素

XAML中炭晒,非空標(biāo)簽都有自己的內(nèi)容(Content)待逞。

標(biāo)簽的內(nèi)容指的是夾在起始標(biāo)簽和結(jié)束標(biāo)簽之間的一些子級標(biāo)簽,每個子級標(biāo)簽都是父級標(biāo)簽內(nèi)容的一個元素(Element)网严,簡稱父級標(biāo)簽的一個元素识樱。

屬性元素指的是某個標(biāo)簽的一個元素對應(yīng)這個標(biāo)簽的一個屬性,即以元素的形式來表達(dá)一個實例的屬性震束。

簡化XAML技巧:

能使用Attribute=Value形式賦值的就不使用屬性元素

充分利用默認(rèn)值怜庸,去除冗余。

充分利用XAML的簡寫方式垢村。

3.2.4 標(biāo)記擴(kuò)展

標(biāo)記擴(kuò)展:所謂標(biāo)記擴(kuò)展割疾,實際上是一種特殊的Attribute=Value語法,其特殊地方在于Value字符串是由一對花括號及其括起來的內(nèi)容組成嘉栓,XAML編譯器會對這樣的內(nèi)容做出解析宏榕、生成相應(yīng)的對象。

例子見P25

Text=”{Binding ElementName=slider1, Path=Value, Mode=OneWay}”分析如下:

當(dāng)編譯器看到這句代碼時就會把花括號里的內(nèi)容解析成相對應(yīng)的對象

對象的數(shù)據(jù)類型名稱是緊鄰左花括號的字符串

對象的屬性由一串以逗號連接的字符串負(fù)責(zé)初始化侵佃,對象的屬性值不再加引號

只有MarkupExtension類的派生類(間接或者直接都可)才能使用標(biāo)記擴(kuò)展語法來創(chuàng)造對象

3.3 事件處理器與代碼后置

XAML標(biāo)簽對應(yīng)一個對象時麻昼,標(biāo)簽一部分Attribute會對應(yīng)對象的Property,另外一部分Attribute對應(yīng)對象的事件(Event)趣钱。

事件處理器(Event Handler):為對象的某個事件指定一個能與該事件匹配的成員函數(shù)涌献,當(dāng)這個事件發(fā)生時,.Net在運行時會去調(diào)用這個函數(shù)首有,即標(biāo)識對這個事件的響應(yīng)和處理燕垃。

WPF支持在XAML里為對象的事件指定事件處理器,方法是使用事件處理器的函數(shù)名為對應(yīng)對象事件的Attribute進(jìn)行賦值井联。格式為:<ClassName EventName=”EventHandlerName”>

代碼后置(Code-Behind):標(biāo)識UI的XAML文件和C#代碼分別表示前臺和后臺卜壕,前臺和后臺用事件Attribute來溝通鏈接。

]]>

可以用此關(guān)鍵字把C#代碼嵌入到XAML文件中(不推薦使用)

3.4 導(dǎo)入程序集和引用其中的名稱空間

.NET的模塊稱為程序集(Assembly)

一個解決方案是一個完成的程序烙常,解決方案中會包含若干項目(Project)轴捎,每個項目是可以獨立編譯的鹤盒,它的編譯結(jié)果就是一個程序集。

XAML引用名稱空間的語法:

xmlns是用于在XMAL中聲明名稱空間的Attribute侦副,它從XML語法繼承而來侦锯,是XML-Namespace的縮寫

冒號后面的映射名是可選的,但由于可以不加映射名的默認(rèn)名稱空間已經(jīng)被WPF的主要名稱空間占用秦驯,所以所引用的名稱空間都需要加上這個映射名尺碰,映射名可以根據(jù)喜好自由選擇

引號中的字符串值確定了你要引用的是哪個類庫及類庫中的哪個名稱空間。

使用引用的類格式:<映射名:類名>……</映射名:類名>

3.5 XAML的注釋

<!—注釋內(nèi)容-->

第四章 x名稱空間詳解

x名稱空間的x是映射XAML名稱空間時給它取得名字译隘;x名稱空間里的成員是專門寫給XAML編譯器看亲桥,用來引導(dǎo)XAML編譯器把XAML代碼編譯成CLR代碼的。

4.1 x名稱空間里都有什么

x名稱空間映射一般為http://schemas.microsoft.com/winfx/2006/xaml

XAML也有自己的編譯器固耘,XAML語言會被解析并編譯题篷,最終形成微軟中間語言存儲在程序集中

x名稱空間中包含的工具列表見P31

x名稱空間中的Attribute

4.2.1 x:Class

這個Attribute作用是告訴XAML編譯器將XAML標(biāo)簽的編譯結(jié)果與后臺代碼中指定的類合并,在使用x:Class時必須遵循以下要求:

這個Attribute智能用于根節(jié)點

使用x:Class的根節(jié)點的類型要與x:Class的值所指示的類型保持一致

x:Class的值所指示的類型在聲明時必須使用partial關(guān)鍵字

x:Class已經(jīng)在剖析最簡單的WPF程序時講過厅目,此處不在贅述

4.2.2 x:ClassModifier

這個Attribute作用是告訴XAML編譯由標(biāo)簽生成的類具有怎么樣的訪問控制級別

使用x:ClassModifier時需要注意事項:

標(biāo)簽必須具有 x:Class Attribute

x:ClassModifier的值必須與x:Class所指示類的訪問控制級別一致

x:ClassModifier的值隨后臺代碼的編譯語言不同而有所不同番枚,具體參看TypeAttributes枚舉類型

4.2.3 x:Name

XAML標(biāo)簽是對象,一個XAML變遷對應(yīng)著一個對象璧瞬,這個對象一般是一個控件的實例户辫。

不帶名稱的XAML對象聲明只負(fù)責(zé)聲明對象而不負(fù)責(zé)為這些對象聲明引用變量。

如果我們需要為對象準(zhǔn)備一個引用變量以便在C#代碼中直接訪問就必須顯示告訴XAML編譯器嗤锉,為這個對象聲明引用變量就要用到x:Name

x:Name的作用有兩個:

告訴XAML編譯器渔欢,當(dāng)一個標(biāo)簽帶有x:Name時除了為這個標(biāo)簽生成對應(yīng)實例以外還要為這個實例聲明一個引用變量,變量名就是x:Name的值

將XAML標(biāo)簽所對應(yīng)對象的Name屬性(如果有)也設(shè)置為x:Name的值瘟忱,并把這個值注冊到UI樹上以方便查找

問題:在XAML代碼中應(yīng)該使用Name還是x:Name

Name屬性定義在FrameworkElement類中奥额,這個類是WPF控件類的基類,所有的WPF控件都有Name這個屬性访诱。當(dāng)一個元素具有Name屬性時垫挨,使用Name或者x:Name效果是一樣的。對于那些沒有Name屬性值的元素触菜,為了在XAML聲明時也創(chuàng)建引用變量以便在C#代碼中訪問九榔,我們只能使用x:Name。

4.2.4 x:FieldModifier

x:FieldModifier用來在XAML里改變引用變量訪問級別

使用x:Name后XAML標(biāo)簽對應(yīng)實例具有自己的引用變量涡相,而且這些引用變量都是類的字段哲泊。默認(rèn)情況下,這些字段的訪問級別按照面向?qū)ο蟮姆庋b原則被設(shè)置成internal催蝗。有時候我們需要從一個程序集訪問另外一個程序集中窗體的元素切威,這個時候需要把訪問控件的引用變量改為public級別。

注意:因為x:FieldMOdifier是用來改變引用變量訪問級別的丙号,所有使用x:FieldModifer的前提是這個標(biāo)簽同時使用x:Name先朦,否則無法通過Name來引用變量缰冤。

4.2.5 x:Key

在XAML文件中,我們可以把需要多次使用的內(nèi)容提取出來放在資源字典(Resource Dicitonary)里喳魏,需用使用這個資源的時候用Key把它檢索出來棉浸,x:Key的作用就是為資源貼上用于檢索的索引。

Resources在WPF中非常重要截酷,需要重復(fù)使用的XAML內(nèi)容涮拗,例如:Style乾戏、各種Template和動畫等都需要放在資源里迂苛。

4.2.6 x:Shared

x:Shared一定要與x:Key配合使用,如果x:Shared為true鼓择,那么每次檢索到這個對象時三幻,我們得到的都是同一個對象,否則得到的是這個對象的一個新副本呐能,默認(rèn)XAML會為資源隱式定義為true念搬。

4.3 x名稱空間中的標(biāo)記擴(kuò)展

x:Type的值應(yīng)該是一個數(shù)據(jù)類型名稱

在XAML中想表達(dá)某個數(shù)據(jù)類型時就需要使用x:Type標(biāo)記擴(kuò)展

代碼示例見書P39

4.3.2 x:Null

顯示的對一個屬性賦予空值

4.3.3 標(biāo)記擴(kuò)展實例的兩種聲明語法

標(biāo)記擴(kuò)展也是標(biāo)準(zhǔn)的.NET類,所以我們也可以使用XAML的標(biāo)簽來聲明標(biāo)記擴(kuò)展的實例摆出。

代碼示例:

第一種表示法:第二種表示法:? ? ? ?

4.3.4 x:Array

x:Array的作用是通過它的Item屬性向使用者暴露一個類型已知的ArrayList實例朗徊。

ArrayList內(nèi)成員類型由x:Array的Type指明。

WPF中把包含數(shù)據(jù)的對象稱為數(shù)據(jù)源(Data Source)

把一個x:Array實例作為數(shù)據(jù)源提供給一個ListBox示例代碼:

添加引用:xmlns:sys="clr-namespace:System;assembly=mscorlib"代碼:? ? ? ? ? ? Tim? ? ? Tom? ? ? Victor? ? ?

例子具體內(nèi)容見P43

4.3.5 x:Static

x:Static的功能是在XAML文檔中使用數(shù)據(jù)類型的static成員

例子見P44

如果一個程序需要國際化支持偎漫,一般會把需要顯示的字符串保存在一個資源類的static屬性中爷恳,所以支持國際化程序的UI中對x:Static的使用非常頻繁

4.4 XAML 指令元素

XAML指令元素有兩個:

x:Code

x:XData

x:Code的作用是在XAML中嵌入C#代碼,一般不會使用

x:XData是一個專用標(biāo)簽

WPF中把包含數(shù)據(jù)的對象稱為數(shù)據(jù)源

用于把數(shù)據(jù)源中的數(shù)據(jù)提供給數(shù)據(jù)使用者的對象稱為數(shù)據(jù)提供者(Data Provider)

XmlDataProvider用于提供XML化的數(shù)據(jù)

如果想要在XAML里聲明一個帶有數(shù)據(jù)的XmlDataProvider實例象踊,那么XmlDataProvider實例的數(shù)據(jù)要放在x:XData標(biāo)簽的內(nèi)容里温亲。

作者:norman1981

鏈接:http://www.reibang.com/p/a552b3f2c7af

來源:簡書

簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處杯矩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栈虚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子史隆,更是在濱河造成了極大的恐慌魂务,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泌射,死亡現(xiàn)場離奇詭異粘姜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)魄幕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門相艇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纯陨,你說我怎么就攤上這事坛芽×舸ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵咙轩,是天一觀的道長获讳。 經(jīng)常有香客問我,道長活喊,這世上最難降的妖魔是什么丐膝? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮钾菊,結(jié)果婚禮上帅矗,老公的妹妹穿的比我還像新娘。我一直安慰自己煞烫,他們只是感情好浑此,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滞详,像睡著了一般凛俱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上料饥,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天蒲犬,我揣著相機(jī)與錄音,去河邊找鬼岸啡。 笑死原叮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凰狞。 我是一名探鬼主播篇裁,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赡若!你這毒婦竟也來了达布?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤逾冬,失蹤者是張志新(化名)和其女友劉穎黍聂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體身腻,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡产还,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘀趟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脐区。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖她按,靈堂內(nèi)的尸體忽然破棺而出牛隅,到底是詐尸還是另有隱情炕柔,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布媒佣,位于F島的核電站匕累,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏默伍。R本人自食惡果不足惜欢嘿,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望也糊。 院中可真熱鬧炼蹦,春花似錦、人聲如沸显设。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捕捂。三九已至,卻和暖如春斗搞,著一層夾襖步出監(jiān)牢的瞬間指攒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工僻焚, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留允悦,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓虑啤,卻偏偏與公主長得像隙弛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狞山,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • “x”名稱空間的成員引導(dǎo)XAML編譯器將XAML編譯成CLR代碼的全闷。“x”就XAML首字母萍启。凡包含XAML代碼的W...
    減法生活閱讀 4,601評論 0 1
  • 1. 簡介 1.1 什么是 MyBatis 总珠? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,452評論 0 4
  • HTML標(biāo)簽解釋大全 一勘纯、HTML標(biāo)記 標(biāo)簽:!DOCTYPE 說明:指定了 HTML 文檔遵循的文檔類型定義(D...
    米塔塔閱讀 3,229評論 1 41
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔局服,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,737評論 2 9
  • “我的裙子好看嗎驳遵?”亞夏娜拎起裙子在安澤爾面前打了個轉(zhuǎn)淫奔,他忽然感覺有點口渴,亞夏娜的裙擺綴著淡紫色的蕾絲堤结,圓潤的小...
    彼鹿閱讀 452評論 1 5