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)并注明出處杯矩。