轉帖|其它|編輯:郝浩|2011-07-08 17:45:03.000|閱讀 1137 次
概述:老實說,我第一次接觸XAML的時候,我還以為是XML呢,再后來仔細一看發現中間多了個A,不過當時我還是覺得這應該是基于XML的一種標記語言,否則也不至于起這么接近的名字吧,后來發現,我算是"小神通"了一把,XAML的確是一種基于XML的界面描述語言。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
老實說,我第一次接觸XAML的時候,我還以為是XML呢,再后來仔細一看發現中間多了個A,不過當時我還是覺得這應該是基于XML的一種標記語言,否則也不至于起這么接近的名字吧,后來發現,我算是"小神通"了一把,XAML的確是一種基于XML的界面描述語言。
眾所周知,WPF的設計目標就是統一桌面應用程序和互聯網應用程序的編程,實際上這也是整個.Net平臺的設計目標,而WPF算是一個非常好的嘗試。實現統一桌面和互聯網界面編程,可以極大的縮短開發應用程序的開發周期,從而減少成本。
廢話不多說,這節簡單的接觸XAML,來看看這到底是神馬玩意。
通俗的講,XAML就是設計人員用來設計界面(桌面應用程序和互聯網應用程序)的一種描述語言。這樣整個應用程序被分成兩大塊:界面設計人員用XAML設計界面,程序開發人云用C#、VB.Net等語言來寫相關的邏輯,開發相應的功能。
俗話說,工欲善其事,必先利其器。先來看看使用XAML或基于XAML的工具:
1.XMALPad
這是一款非常簡易的XAML工具。
這款軟件上手基本沒有難處,最大的缺點就是沒有即時提示消息,完全類似于在記事本中寫HTML代碼,需要灰常大的記憶量,優點是簡單、輕便,可以作為Demo演示的小工具。
2.Kaxaml
這是一款非常適合設計人員的工具。
顯而易見,不僅添加了許多的功能,而且畫面看起來也比較精美,更重要的是無與倫比的即時提示窗口,這可以避免我們記憶大量的屬性。
附下載地址://kaxaml.com/
3.Visual Studio 2008/2010
我們強大的Visual Studio怎么能缺席這場盛宴呢,而對于我們這些開發人員來說,顯然最適宜的還是VS。
VS2010與這布局基本類似,就不上圖了。總之,以我個人而言,我還是推薦在VS中編寫所有代碼(對于我們這些開發人員而言,如果是專業的界面設計人員,當然沒必要在這個龐然大物里面寫代碼)。
4.Expression Blend
這是微軟專門推出的一款針對設計人員的開發工具,如果企業級的開發,用這款軟件無疑是最好的選擇,但是最大的缺點是這軟件不便宜啊(汗一個),由于我的電腦里沒有裝這款軟件,所以直接上網上的截圖。
好了,工具已經備齊,下面就來見識一下XAML的語法。
根據張晗雨先生總結的XAML使用規則:
(1).每一個XAML文檔中聲明的元素都應該與一個CLR類匹配,其中該類的名稱由該元素的名稱標示。
如上面經常作為示例的<Button Width="100" Height="100">Hello XAML</Button>,這里面的Button是CLR中的一個Button類,有點Winform基礎的都知道這個類,而在WPF中也是如此,當然WPF中的類與Winform中的類不在同一個命名空間內,這以后再說。
(2).在XAML中,用戶可以對元素進行嵌套定義。在其他元素中定義XAML元素通常是對其父元素中的一個屬性進行賦值的過程。
如<StackPanel>
<Button Width="100" Height="100">Hello XAML</Button>
</StackPanel>
這里的StackPanel也是一個控件,這在后面的控件章節會提到。控件里面可以包含控件,但是還是需要注意一些的,比如說父控件的結束標志的位置等等,這些在學習的過程中自然會體會到,多說無益。
(3).在XAML中,對元素屬性的賦值實際上就是對該元素所對應的類實例的屬性進行賦值,或者是對該類中定義的事件添加響應函數。
先來看XAML代碼:
<Button Width="100" Height="100">Hello XAML</Button>
對應的等價C#代碼則為:
Button btn=new Button();
btn.Width=100;
btn.Height=100;
btn.Content="Hello XAML";
從上面的示例也可以看出XAML一行代碼的效果,C#需要多行才能實現,所以XAML在界面描述上是遠甚于C#的。
下面,來深入的了解完整的XAML代碼的組成:
1.根元素:
XAML中的根元素有四個:Window,Page,Application,ResourceDictionary。
很顯然,Window是對應與桌面應用程序的,page是對應于互聯網應用程序的,當然這只是普遍情況,有時候桌面應用程序也用Page。
后面兩個分別表示一個應用程序和一個邏輯資源的集合。
2.命名空間
XAML的命名空間用xmlns來表示,一般來說下面兩個命名空間就包括了WPF中所有的命名空間:
//schemas.micosoft,com/winfx/2006/xaml/presentation;
//schemas.microsoft.com/winfx/2006/xaml
需要注意的是,這兩個命名空間跟網址沒有關系,在瀏覽器里輸入這兩個地址是找不到這個站點的。
如果要使用非WPF命名空間中的類,那么就需要在XAML中引入相應的命名空間。
為XAML添加一個CLR名字空間引用的語法如下所示:
xmlns:Prefix="clr-namespace:Namespace;assembly=AssemblyName"
xmlns是"XML Namespace"的縮寫。
prefix是XAML名字空間的前綴,通過它可以訪問到相應的CLR名字空間中定義的類。
除了//schemas.micosoft,com/winfx/2006/xaml/presentation這個命名空間是xmlns="//schemas.micosoft,com/winfx/2006/xaml/presentation"的方式引用外(因為它是WPF在XAML中默認命名空間),其他的所有命名空間均需要以xmlns:Prefix...的形式引用。
Namespace,即Prefix所對應的CLR名字空間的名稱。
AssemblyName,即Namespace所指向的CLR名字空間定義所在的二進制文件位置。注意:不需要添加該二進制文件的擴展名。
在實際應用中,我們會看到很多以x:...開頭的關鍵字,以"x:"為前綴的屬性均是定義在XAML名字空間"//schemas.microsoft.com/winfx/2006/xaml"中的特征屬性
關 鍵 字 |
何處有效 |
含義/描述 |
x:Class |
根元素的特性 |
為根元素定義一個派生自元素類型的類,可以在前面加上.NET命名空間作為前綴(可選) |
x:ClassModifier |
根元素的特性,必須與x:Class一起使用 |
定義由x:Class指定的類的可見性(該類默認是可見的)。該特性值必須根據使用的過程語言指定(如,C#中的public或internal) |
x:Code |
XAML中任何位置的元素,但是必須與x:Class一起使用 |
嵌入過程式代碼,會被插入由x:Class指定的類中 |
x:FieldModifier |
非根元素上的特性,但必須與x:Name(或者等效關鍵字)一起使用 |
定義生成的元素(默認是內部元素)字段的可見性,與x:ClassModifier一樣,該值必須根據過程語言來指定。(如C#中的public、private等) |
x:Key |
父元素實現了IDictionary的元素的特性 |
當被添加到父元素的字典里時,請為該項指定鍵名 |
x:Name |
非根元素上的特性,但必須與x:Class一起使用 |
為給元素生成的字段選擇一個名稱,這樣它就可以在過程式代碼中被引用 |
x:Shared |
Resource-Dictionary對象中的元素特性,但只有在XAML編譯后才可使用 |
可以被設置為false來避免在多個地方共享同資源實例,在第8章中有所講解 |
x:Subclass |
根元素的特性,必須與x:Class一起使用 |
為保存XAML內容的x:Class類指定一個子類,可以用.NET命名空間作為可選前綴(用于那些沒有提供部分類支持的語言) |
x:TypeArguments |
根元素的特性,必須與x:Class一起使用 |
使根類成為泛型(如List<T>)且帶指定的范型參數實例(如List<Int32>或List<String>),可以設置一個用逗號分割的泛型參數代碼清單,如果某類型不在默認的命名空間里,需要加上XML命名空間前綴 |
x:Uid |
元素的特性 |
為元素添加一個本地化ID,詳見第8章 |
x:XData |
用于某個IXmlSerializable類型屬性的值的元素 |
對XAML解析器透明的任一個XML數據島,詳見第9章 |
還有一些常用的字符序列:
擴 展 |
含 義 |
x:Array |
代表一個.NET數組。x:Array元素的子元素都是數組元素。它必須與x:Type一起使用,用于定義數組類型 |
x:Null |
表示一個空引用 |
x:Static |
引用在過程式代碼中定義的任何一個靜態的屬性、常量或枚舉值。在XAML編譯后,這也可以是同一個程序集中的一個非公共成員。如果在默認的命名空間中沒有該類型,Member字符串必須有XML命名空間前綴 |
x:Type |
表示System.Type的一個實例,就像C#中的typeof操作符。如果在默認的命名空間中沒有該類型,TypeName字符串必須有XML命名空間前綴 |
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園