WPF:XAML概述
簡介
XAML是eXtensible Application Markup Language可擴充套件應用程式標記語言,它是微軟公司為構建應用程式使用者介面而建立的一種新的描述性語言。XAML提供了一種便於擴充套件和定位的語法來定義和程式邏輯分離的使用者介面,而這種實現方式和ASP.NET中的"程式碼後置"模型非常類似。XAML是一種解析性的語言,儘管它也可以被編譯。它的優點是簡化程式設計式上的使用者建立過程,應用時要新增程式碼等。
1.什麼是XAML
軟體開發中最典型的分工合作就是設計師(Designer)與程式設計師(Programmer)之間的協作。一般協作是這樣進行的:
(1)需求分析結束後,程式設計師對照需求設計一個使用者介面(User Interface,UI)的草圖,然後把精力主要放在實現軟體的功能上。
(2)與此同時,設計師對照需求、考慮使用者的使用體驗(User Experience,UX)、使用專門的設計工具(比如PS)設計出優美的UI。
(3)最後,程式設計師按照設計師繪製的效果圖,使用程式語言實現軟體的UI。
設計師和程式設計師的合作是“序列”的,如果設計師能與程式設計師“並行”工作並且直接參與程式開發中來,會解決很多問題。
微軟借鑑了網路程式開發團隊的經驗,把開發模式從網路開發移植到桌面開發和富媒體網路程式的開發上,創造了一種新的開發語言-XAML(讀作zaml)。全稱為Extensible Application Markup Language,即可擴充套件應用程式標記語言。扮演著HTML+CSS+Javascript的角色。
設計師使用Blend來設計UI,程式設計師則使用VS開發後臺邏輯程式碼。
2.XAML的優點
巨大優點是它幫助開發團隊真正實現了UI與邏輯的剝離。
3.XAML入門
非空標籤:<Tag Attribute1=Value1 Attribute2=Value2>Content</Tag>
空標籤:<Tag Attribute1=Value1 Attribute2=Value2/>
Property(屬性)屬於面向物件理論範疇。在使用面向物件思想程式設計的時候,常常需要對客觀事物進行抽象,再把抽象出來的結果封裝成類,類中用來表示事物狀態的成員就是Property。Property(屬性)是針對物件而言的。
Attribute(特性)是語言層面的東西,是給編譯器看的。Attribute只是用來影響類在程式中的用法,而Property則對應著抽象物件身上的形狀,她們根本不是一個層面上的東西。比如有兩個同類的語法元素A和B,為了表示A與B不完全相同或者A與B在用法上有些區別,這時候要針對A和B加一些Attribute。也就是說,Attribute只與語言層面上的東西相關,與抽象出來的物件沒什麼關係。因為Attribute表示“區分”的,所以把它譯為“特徵”。習慣上,英文中把標籤式語言中表示一個標籤特徵的“名稱-值”對稱為Attribute。往往是一個標籤所具有的 Attribute多於它所代表的物件的Property。
XAML是一種“宣告”式語言,當你見到一個標籤,就意味著聲明瞭一個物件,物件之間的層級關係要麼並列、要麼是包含,全都體現在標籤的關係上。
XAML使用標籤來定義UI元素(UI Element),每個標籤對應.NET Framework類庫中的一個控制元件類。通過設定標籤的Atrribute,不但可以對標籤所有對應空間物件的Property進行賦值,還可以做一些額外的事件。
4.XAML 文件的樹形結構
XAML使用樹形邏輯結構來描述UI。例如
<Window>
<StackPanel>
<TextBox/>
<TextBox/>
<StackPanel>
<TextBox/>
<TextBox/>
</StackPanel>
<Button>
<Image/>
</Button>
</StackPanel>
</Window>
5.XAML中為物件屬性賦值的語法
XAML中為物件屬性賦值共有兩種語法:
使用字串進行簡單賦值
使用屬性元素進行復雜賦值
5.1 使用標籤的Attribute為物件屬性賦值
這種通過Attribute=Value語法賦值時,Value只可能是一個字串值。
5.2使用TypeConverter類將XAML標籤的Attribute與物件的Property進行對映(不懂)
5.3 屬性元素
非空標籤均有自己的內容(Content)。標籤的內容指的就是夾在起始標籤和結束標籤之間的一些子級標籤,每個子級標籤都是父級標籤內容的一個元素。
5.4標記擴充套件
所謂標記擴充套件,實際是一種特殊的Attribute=Value語法,其特殊的地方在於Value字串是由一對花括號及其括起來的內容組成,XAML編譯器會對這樣的內容作出解析。生成相應的物件。
例如:
<TextBox Text="{Binding ElementName=slider,Path=Value,Mode=OneWay}"/>
6.事件處理器與程式碼後置
WPF支援XAML裡為物件的事件指定事件處理器,方法是使用事件處理器的函式名為對應事件的Attribute進行賦值:<ClassName EventName="EventHandlerName">
程式碼後置:設計師用XAML為程式建立漂亮的“殼”(UI)並展現給客戶;程式設計師用C#編寫程式的“瓢”(邏輯)、從後臺支援前面的“殼”--這種將邏輯程式碼與UI程式碼分離、隱藏在UI程式碼後面的形式就叫程式碼後置(Code-Behind)。
7.匯入程式集和引用其中的名稱空間
XAML引入名稱空間的語法:xmlns:對映名=“clr-namespace:類庫中名稱空間的名字;assembly=類庫檔名”。
一旦我們將類庫中的名稱引用XAML文件,我們就可以使用這些名稱空間裡的類。語法格式:<對映名:類名>...</對映名:類名>
8.XAML的註釋
XAML的註釋繼承自XML,語法是:<!--需要被註釋掉的內容-->
9.x名稱空間
大凡包含XAML程式碼的WPF成員都需要通過語句xmlns:x="http://schemas.microsoft.com/winfx/2006/xmal"來引入http://schemas.microsoft.com/winfx/2006/xmal這個名稱空間。
x名稱空間包含的工具
9.1 x:Class
這個Attribute的作用是告訴XAML編譯器 XAML標籤的編譯結果與後臺程式碼指定的類合併。
9.2 x:ClassModifier
這個Attribute的作用是告訴XAML編譯有標籤編譯生成的類具有怎樣的訪問控制級別。
9.3 x:Name告訴XAML編譯器,當一個標籤帶有x:Name時除了為這個標籤生成對應例項外 還要為這個例項宣告一引用變數,變數名就是x:Name的值。將XAML標籤所對應物件的Name屬性也設為x:Name的值,並把這個值註冊到UI樹上,以便查詢。
x:Name的x加一個冒號,說明它來自x這個名稱空間。這個名稱空間是定義在XAML的根元素上的。也就是這句:
這個x就是XAML的字頭了。這個名稱空間的本意就是告訴我們——這個名稱空間裡所裝的元素都與XAML解析有關。比如,我在程式碼裡還使用了x:Code,把本來應該呆在C#程式碼裡的內容請到XAML裡來了。
可見,x:Name與Name根本不是一個層面上的東西——Name是直接與元素和麵向物件程式設計相關的東西;x:Name是XAML語言解析層面上的東西。詳細參考
9.4 x:FieldModifierx:FieldModifier用來在XAML裡改變引用變數訪問級別的。例如:
<TextBox x:Name="textBox1" x:FieldModifier="public" Margin="5"/> 預設的訪問級別預設為internal。x:FiledModifier使用前提是這個標籤同時也使用x:Name。
9.5 x:Key
x:Key的作用就是為資源貼上用於檢索的索引。例如:
xmls:sys ="clr-namespae:System;assembly=mscorlib"
<Window.Resources>
<sys:String x:Key="myString">Hello WPF Resource!</sys:String>
</Window.Resources>
<Textbox Text="{StaticResourc ResourceKey=myString}"/>
以下四個標籤擴充套件
9.6 x:Type
x:Type的值應該是一個數據類的名稱。
9.7 x:Nullxaml中的空值
9.8 x:Array
通過它的Items屬性向使用者暴露一個型別已知的ArralyList例項,ArrayList內成員的型別又x:Array的Type指明。
9.9 x:Static
xaml中使用資料型別的static成員。