XAML是什么
XAML(Extensible Application Markup Language) 是一種聲明性標記語言。如同應用於 .NET Framework 編程模型一樣,XAML 簡化了為 .NET Framework 應用程序創建 UI 的過程。我們可以在聲明性 XAML 標記中創建可見的 UI 元素,然后使用代碼隱藏文件(通過分部類定義與標記相連接)將 UI 定義與運行時邏輯相分離。XAML 直接以程序集中定義的一組特定后備類型表示對象的實例化。這與大多數其他標記語言不同,后者通常是與后備類型系統沒有此類直接關系的解釋語言。XAML 實現了一個工作流,通過此工作流,各方可以采用不同的工具來處理應用程序的 UI 和邏輯。
XAML是一種由XML派生而來的語言,所以很多XML中的概念在XAML是通用的。比如使用標簽聲明一個元素(每個元素對應內存中的一個對象)時,需要使用起始標簽<Tag>和終止標簽</Tag>,夾在兩者之間的XAML代碼表示是隸屬於這個標簽的內容。如果沒有下級隸屬元素(對象),則這個稱為空標簽,可以寫為<Tag/>(自結束標記)。
以文本表示時,XAML 文件是通常具有 .xaml 擴展名的 XML 文件。可通過任何 XML 編碼對文件進行編碼,但通常編碼為 UTF-8。
2、XAML語法基礎
注意:XAML對於WPF不是必須的,理解這一點很重要。Visual Studio也可以使用Windows窗體方法,通過語句代碼來構造WPF窗口。但是如果這樣的話,窗口將被限制在Visual Studio開發環境之內,並且只能由開發人員使用。
XAML是一種又XML派生而來的語言,所以很多XML中的概念在XAML是通用的。除了XML的特性外,XAML更是具備大量的專有特性。
(1)命名空間
XAML命名空間的概念和C#代碼中的Using,VB.Net代碼中的Import類似,它為對象元素的實例化提供引用類庫聲明。
編程框架能夠區分用戶聲明的標記和框架聲明的標記,並通過命名空間限定來消除可能的標記沖突。例如一個新建的WPF窗體的定義代碼:
<Window x:Class="wpfHelloWorld.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:wpfHelloWorld" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid>
</Grid> </Window> |
命名空間的語法格式如下:
Xmlns[:可選的命名空間前綴]="名稱空間"
默認命名空間無需定義命名空間前綴名,即意味着所有來自於這個名稱空間的標簽前都不用加前綴。默認命名空間只能有一個,而且應該選擇其中元素被最頻繁使用的名稱空間來充當。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
默認加載的兩個命名空間非常重要,前者包含了幾乎所有常用的命名空間,這將使得在XAML中我們可以直接使用這些命名空間中的類型,而不需要使用前綴(完全限定名);而x命名空間,也成為XAML命名空間包含了各種XAML的解析應用,它包含的用法非常多,可以分為Attribute、標簽擴展、XAML指令元素三個種類,每個類別都有一些特別的用法。
x:Key
在WPF中,幾乎每個元素都有自己的Resource屬性,這個屬性就是"key-value"的集合。只要把元素放進這個集合里,這個元素就成了資源字典中的一個條目。當然,為了能檢索到這個條件,就必須為它添加x:Key。x:key的作用就是使用為資源貼上用於檢索的索引,它為資源字典中的每個資源設置一個唯一鍵。
x:Class
這個Attribute是告訴XAML編譯器將XAML編譯器編譯的結果和后台編譯結果的哪一個類進行合並。后台相同類名前使用了partial關鍵字,這樣由XAML解析成的類和C#代碼文件里定義的部分就合二為一。正是這種機制我們才可以把類的邏輯代碼留在.CS文件里,用C#語言來實現,而把哪些與聲明及布局UI元素相關的代碼分離出去,實現UI與邏輯分離。而后者使用XAML和XAML編輯工具就能輕松搞定。
x:Name
它表示處理 XAML 中定義的對象元素后,為運行時代碼中存在的實例指定運行時對象名稱。在實際項目中,控件元素和資源的命名規則是只在需要的時候對控件和資源進行命名操作,絕大多數XAML元素都沒有明確命名,因為它們不需要被其他代碼所訪問,其存在僅僅是提供靜態作用。
x:Type
一般情況下,我們在編程中操作數據類型的實例或者實例的引用,但有的時候我們也需要用到數據類型本身。
x:Type顧名思義應該是一個數據類型的名稱。當我們想在XAML中表達某一數據類型就需要用到x:Type標記擴展。比如某個類的一個屬性,它的值要求的是一個數據類型,當我們在XAML中為這個屬性賦值是就需要用到x:Type。
x:Null
在XAML里面表示空值就是x:Null。多數時候我們不需要為屬性賦一個Null值,但如果一個屬性開始就有默認值而我們有不需要這個默認值就需要用到Null值了。在WPF中,Style是按照一個特定的審美規格設置控件的各個屬性,程序員可以為控件逐個設置style,也可以指定一個style目標控件類型,一旦指定了目標類型,所有的這類控件都將使用這個style----除非你顯示的將某個實例的Style設置為Null。
x:Code
x:Code的作用是可以在XAML文檔中可以編寫后置的C#后台邏輯代碼,當然這樣寫的問題破壞了XAML和CS文件的分工,使得代碼不容易維護,不宜調試。
(類似於ASP.NET在ASPX文件中嵌入服務器代碼。)
同時WPF中對它的使用有嚴格的限制,並不建議使用。
(2)XAML對象
因為XAML是用來在UI上繪制控件的,而控件本身就是面向對象的產物,所以一個XAML標簽,就意味着一個對象。在XAML中,對象和對象之間層次關系要么是並列,要么是包含,全部都體現在標簽的關系上。
XAML中使用開始標記和結束標記將對象實例化為XML格式的元素,如:
<Canvas>
</Canvas>
對象中可以包含其他對象,如:
<Canvas>
<Rectangle></Rectangle>
</Canvas>
若一個對象中不包含其他對象,可以使用一個自結束標記來聲明對象
<Rectangle/>
(3)XAML對象屬性
在XAML中對於屬性有兩種表述,針對標簽而言時屬性用叫"Atrribute"(特征),針對對象而言時屬性叫"Property"(屬性),它們不是一個層面上的內容。而且標簽的Atrribute與對象的Property也不是完全映射的,往往是一個標簽所具有的Atrribute多於它所代表的對象的Property。
在XAML中也使用屬性對XAML元素特征進行描述,並且屬性不允許在XAML中重復設置多次,但允許在托管代碼中改變元素的屬性值。
在XAML中有多種屬性設置方法:
(1)使用屬性語法
只有實例化對象才可以設置實例屬性,格式如下:
<objectName propertyName="propertyValue"/>
或者
<objectName propertyName="propertyValue">
</objectName>
XAML的屬性應用類似於HTML。每個屬性對應一個屬性值,屬性值類型必須與屬性匹配,一個標記中可以設置對象的多個屬性。例如:
<Canvas Width="150" Height="150" Background="Red">
</Canvas>
(2)使用屬性元素語法
某些屬性可以使用屬性元素語法來設置,格式為:
<object>
<object.property>
<!—元素屬性值-->
</object.property>
</object>
將一個對象作為另一個XAML對象的屬性值
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Button.Content>
<Rectangle Height="40" Width="40" Fill="Black"/>
</Button.Content>
</Button>
(3)使用內容元素語法
某些元素的屬性支持內容元素語法,允許忽略元素的名稱,實例對象會根據XAML元素中的第一個標記值來設置屬性。對於大量的格式化文本,使用內容元素語法更加靈活,屬性標記之間可以插入大量的文本內容。
<TextBlock Width="200" TextWrapping="Wrap">
文本信息.....
</TextBlock>
(4)使用集合語法
元素支持一個屬性元素的集合時才能使用集合語法進行設置屬性。對於這類屬性可以使用托管代碼的Add方法來增加更多的集合元素,它的本質是向對象的集合中添加屬性項。
<Rectangle Width="200" Height="150">
<Rectangle.Fill>
<LinearGradientBrush>
<GradientStopCollection>
<GradientStop Offset="0.0" Color="Gold"/>
<GradientStop Offset="1.0" Color="Green"/>
</GradientStopCollection>
</LinearGradientBrush> …
(4)XAML對象特殊屬性
(1)附加屬性
附加屬性作用於支持附加屬性的元素,它是由支持附加屬性的父元素產生作用,支持附加屬性的元素會繼承所在的父元素的屬性。
附加屬性的格式:AttachedPropertyProvider.PropertyName。
例如:<Canvas>
<Rectangle Canvas.Left="50" Canvas.Top="50" Width="200" Height="150" RadiusX="10" RadiusY="10" Fill="Gold"/>
</Canvas>
(2)依賴屬性
依賴屬性和CLR屬性類似,提供一個實例級私有字段的訪問封裝,通過GetValue和SetValue訪問器實現屬性的讀寫操作。最重要一個特點是屬性值依賴於一個或者多個數據源,提供這些數據源的方式也可以不同。
由於依賴多數據源的緣故,故稱之為依賴屬性。
依賴屬性可以通過多種不同類型的數據源進行賦值,不同賦值順序影響屬性值的改變。
<Button Content="依賴屬性測試" Style="{StaticResource ButtonStyle}" Width="240" Foreground="Yellow" FontFamily="14"/>
在該案例中根據依賴屬性優先級,本地屬性的賦值具有更高優先級,因此其樣式屬性賦值就沒有效果了,按鈕的文字前景色為黃色,字號是14號。
(5)XAML新特性
微軟Windows 8系統不僅適用於PC,而且適用於平板電腦。針對平板電腦的特性,XAML也增加了新的事件處理特性。主要體現在:
(1)繼承傳統事件處理機制,XAML將控制按鈕點擊事件;
(2)監聽列表控件選項事件;
(3)監聽應用激活和暫停事件;
(4)觸控事件處理,包括指針處理,手勢處理以及控制操作事件等;
3、WPF中的樹
(1)邏輯樹
XAML天生就是用來呈現用戶界面的,這是由於它具有層次化的特性。在WPF中,用戶界面由一個對象樹構建而成,這棵樹叫作邏輯樹。邏輯樹始終存在於WPF的UI中,不管UI是用XAML編寫還是用代碼編寫。WPF的每個方面(屬性、事件、資源等等)都是依賴於邏輯樹的。WPF邏輯樹的理解對深入開發至關重要。
(2)可視樹
可視樹可以說是邏輯樹的擴展,它是把邏輯樹中的每個節點全部打散,然后放到可視組件中,這樣形成的一棵樹,叫做可視樹。在可視樹中出現的節點有些在邏輯樹中是沒有的。邏輯樹的結點對我們而言基本是一個黑盒。而可視樹不同,它暴露了視覺的實現細節。
(3)樹圖
<Window>
<Grid>
<Label Content="Label" />
<Button Content="Button" />
</Grid>
</Window>
(5)XAML事件
Events,中文稱為事件,是Windows消息機制中重要概念之一,也是最常見的人機交互手段之一。在傳統應用中,一個對象激活一個事件被稱為Event Sender(事件發送者),而事件所影響的對象則稱為Event Receiver(事件接收者)。例如,在Windows Forms應用開發中,對象事件的sender和receiver永遠是同一個對象。簡單的理解,如果你點擊一個按鈕對象,這個按鈕對象激活Click事件,同時該對象后台代碼將接收事件,並執行相關邏輯代碼。
而XAML中不僅繼承傳統事件處理方式,並且引入依賴屬性系統,同時還引入一個增強型事件處理系統—Routed Event(路由事件)。路由事件和傳統事件的不同是,路由事件允許一個對象激活事件后,既是一個Event Sender(事件發送者),同時擁有一個或者多個Event Receiver(事件接收者)。
XAML的路由事件(Routed Events)處理方式可分為三種:
a. 冒泡事件(Bubbling Event),該事件是最常見的事件處理方式。該事件表示對象激活事件后,將沿着對象樹由下至上,由子到父的方式傳播擴散,直到被處理或者到達對應的根對象元素。
b. 隧道事件(Tunneling Event),該事件處理方式和冒泡事件相反,對象激活事件后,將從根對象元素傳播擴散到激活事件的子對象。
c. 直接路由事件(Direct Routing Event),該事件沒有向上或者向下傳播擴散,僅作用於當前激活事件的對象上。
(5)XAML新特性
微軟Windows 8系統不僅適用於PC,而且適用於平板電腦。針對平板電腦的特性,XAML也增加了新的事件處理特性。主要體現在:
(1)繼承傳統事件處理機制,XAML將控制按鈕點擊事件;
(2)監聽列表控件選項事件;
(3)監聽應用激活和暫停事件;
(4)觸控事件處理,包括指針處理,手勢處理以及控制操作事件等;