標籤:
XAML的命名空間
命名空間格式:文法結構為“xmlns:”+“命名空間首碼名”,預設命名空間無需定義命名空間首碼名“xmlns”
命名空間的聲明
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
命名空間的用途:約束文檔規範,明確標籤的類型。
xmlns(XML Namespace)預設命名空間
xmlns:x 可以理解為給命名空間起別名
xmlns不是XAML中特有或特別定義的,它是XML具備的,目的是為了約束XML的文檔結構
xmlns:d 和 xmlsn:ms 是為 Visual Studio 設計檢視服務的,不會對程式造成任何影響
URI 統一資源定位器:"http://schemas.microsoft.com/winfx/2006/xaml"
XAML名稱範圍(x:)語言特性
x:Class
配置XAML編譯,在標記和程式碼後置之間串連部分類別。代碼部分類別在一個獨立的代碼檔案中定義,標記部分類別由代碼是由XAML在編譯過程間建立。
<object
x:Class="namespace.classname"...>
...
</object>
x:FieldModifier
修改XAML編譯行為,使指定對象引用的欄位被定義有public存取權限而不是預設的private行為。
<object
x:FieldModifier="public"
... />
x:Key
唯一標識作為資源被建立和引用的元素,這些資源存在於一個ResourceDictionary中。
<ResourceDictionary>
<object x:Key="stringKeyValue".../>
</ResourceDictionary>
隱式 ResourceDictionary 中使用:
<object.Resources>
<object x:Key="stringKeyValue".../>
</object.Resources>
x:Name
唯一標識對象元素,可方便從程式碼後置或一般代碼中訪問已執行個體化的對象。應用於支援的編程模型之後,x:Name可視為等效於持有一個對象引用(由一個建構函式返回)的變數。
x:Key和x:Name不是相同的概念。
x:Key僅用於資源詞典中。
x:Name用於XAML的所有地區。
一個使用索引值的FindName調用不會檢索鍵資源。
x:Uid
為標記元素提供一個唯一識別碼。對於Windows運行時XAML,這個唯一識別碼供XAML本地化過程和工具使用。
<Button
x:Uid="ResourceKey"
Content="被資源中鍵為“ResourceKey.Content的值替換”"/>
開發多語言化系統時會經常用到。
其他XAML固有資料類型,就是常見的單一資料型別的聲明:
x:Boolean
對於CLR支援來說,原語對應於Boolean。XAML分析x:Boolean的值時區分大小寫。請注意,"x:Bool"不是可接受的替代原語。
x:String
對於CLR支援來說,原語對應於
String。對字串的編碼預設採用包圍XML編碼。
x:Double
對於CLR支援來說,原語對應於Double。除了數字值,x:Double的文本文法支援令牌 "NaN",這是將布局行為的"Auto"儲存為資源值的方式。對這些令牌的處理區分大小寫。你可以使用科學計數法,例如將1,000,000 記為"1+E06"。
x:Int32
對於CLR支援來說,原語對應於Int32。x:Int32被視為帶有符號,你可以為負整數包含減號(“-”)。在XAML中,文本文法中缺少符號表示有符號正值。
對象聲明方式
使用開始標記和結束標記將對象執行個體化為XAML格式的元素
<Canvas>
</Canvas>
對象中可以包含其他對象
<Canvas>
<Rectangle></Rectangle>
</Canvas>
若一個對象中不包含其他對象,可以使用一個自結束標記來聲明對象
<Rectangle/>
XAML建立對象元素
- 標籤名即控制項名稱
- 一個XAML檔案只允許有一個根對象元素Page
- 標籤屬性或子標籤為控制項對象屬性操作
- 每個XAML標籤都會有一個相對應的類型
- 每聲明一個XAML節點就相當於建立相應類型的對象
- 在哪個元素結點下添加標籤就相當於在哪個對象下添加對象
屬性設定四種方式
? 屬性索引值文法
? 屬性元素文法
? 內容元素文法
? 隱式集合文法
不同的屬性類型我們可以選擇不同的設定方式
簡單類型資料,比如字串、數字之類的使用索引值形式,即PropName=“PropValue”
複雜類型資料,比如文字區塊值、按鈕內容、背景圖片,使用屬性元素形式
內容元素文法(預設文法)為了方便
集合性質使用集合文法
屬性索引值文法:
只有執行個體化對象才可以設定執行個體屬性,格式如下:
<objectName propertyName=“propertyValue”/>
或者
<objectName propertyName=“propertyValue”>
<objectName>
每個屬性對應一個屬性值,屬性值類型必須與屬性匹配
一個標記中可以設定對象的多個屬性
objectName是要執行個體化的對象,propertyName是需要設定的屬性名稱,propertyValue是屬性的值
<Canvas Width=”150” Height=”150” Background=”Red”/>
或者
<Canvas Width=”150” Height=”150” Background=”Red”>
</Canvas>
絕大多數屬性都是使用屬性索引值的形式來操作
要求屬性類型必須為一些“簡單的/可以自動轉換的”類型
內建屬性類型轉換器
僅針對一些複雜類型的控制項屬性
用於將XAML屬性中設定的字串轉換成為相應的強型別資料
例如:
<Button
x:Name="btn"
HorizontalAlignment="Left"/>
對比
btn.HorizontalAlignment = HorizontalAlignment.Left;
XAML中只需要將HorizontalAlignment屬性設定為Left字串即可將控制項的水平對其屬性改為靠左對齊
屬性元素文法
某些屬性可以使用屬性元素文法來設定,格式為:
<object>
<object.property>
<!—元素屬性值-->
</object.property>
</object>
如果一個對象的屬性是一個複雜類型,不能夠由簡單的字串直接表示的時候,這時需要用到屬性元素的文法:
<標籤名>
<標籤名.屬性名稱>
<屬性值/>
</標籤名.屬性名稱>
</標籤名>
文字區塊值,按鈕內容,背景圖片
<Ellipse Width=”150” Height=”150”>
<Ellipse.Fill>
<SolidColorBrush Color=”Green”/>
</Ellipse.Fill>
</Ellipse>
內容元素文法
某些元素的屬性支援內容元素文法,允許忽略元素的名稱
執行個體對象會根據XAML元素中的第一個標記值來設定屬性
對於大量的格式化文本,使用內容元素文法更加靈活
屬性標記之間可以插入大量的常值內容
<TextBlock>Windows 10</TextBlock>
對於大多數對象元素都有一個預設屬性;
直接將元素的 “InnerText” 設定為屬性值:
例如:
<Button x:Name="btn1" Content="Hello"/>
<Button x:Name="btn2">
World
</Button>
通過特性標籤知道預設屬性
[ContentProperty(Name = "Content")]
隱式集合文法
元素支援一個屬性元素的集合,才使用集合文法進行設定屬性
使用Managed 程式碼的Add方法來增加更多的集合元素
本質是向對象的集合中添加屬性項
在此之前我們考慮的都是非集合性質的屬性;
對於一個集合類的屬性可以用重複子項目的方式實現設定值:
<Grid>
<Grid.Children>
<TextBlock>Hello1</TextBlock>
<TextBlock>Hello2</TextBlock>
<TextBlock>Hello3</TextBlock>
<TextBlock>Hello4</TextBlock>
<TextBlock>Hello5</TextBlock>
</Grid.Children>
</Grid>
<Rectangle Width=”200” Height=”150”>
<Rectangle.Fill>
<LinearGradientBrush>
<GradientStopCollection>
<GradientStop Offset=”0.0” Color=”Gold”/>
<GradientStop Offset=”1.0” Color=”Green”/>
</GradientStopCollection>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Width=”200” Height=”150”>
<Rectangle.Fill>
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Offset=”0.0” Color=”Gold”/>
<GradientStop Offset=”1.0” Color=”Green”/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
省略GradientStopCollection隱式的屬性設定方法
附加屬性
附加屬性作用於支援附加屬性的元素
附加屬性是由支援附加屬性的父元素產生作用,支援附加屬性的元素會繼承所在的父元素的屬性
附加屬性的格式:AttachedPropertyProvider.PropertyName
AttachedPropertyProvider為附加屬性的提供者,PropertyName為附加屬性的名稱
<Canvas>
<Rectangle Canvas.Left=”50” Canvas.Top=”50” Width=”200” Height=”150” RadiusX=”10” RadiusY=”10” Fill=”Gold”/>
</Canvas>
Rectangle元素設定了Canvas.Left和Canvas.Top屬性,使用Canvas進行布局時,包含在<Canvas>…</Canvas>之間的元素就會產生相對於Canvas對象的附加屬性Canvas.Left和Canvas.Top屬性
相依性屬性
英文名稱:Dependency Properties
相依性屬性和CLR屬性類似,提供一個執行個體級私人欄位的訪問封裝,通過GetValue和SetValue訪問器實現屬性的讀寫操作
最重要一個特點是屬性值依賴於一個或者多個資料來源,提供這些資料來源的方式也可以不同
由於依賴多資料來源的緣故,故稱之為相依性屬性
XAML的路由事件(Routed Events)處理方式可分為三種:
冒泡事件(Bubbling Event),該事件是最常見的事件處理方式。該事件表示對象啟用事件後,將沿著對象樹由下至上,由子到父的方式傳播擴散,直到被處理或者到達對應的根對象元素,或者該事件對應得RoutedEventArgs.Handled=true時,完成處理。在傳播擴散中,所有涉及的元素對象都可以被該事件進行控制。該事件可被Windows 8,Silverlight支援。
隧道事件(Tunneling Event),該事件處理方式和冒泡事件相反,對象啟用事件後,將從根對象元素傳播擴散到啟用事件的子物件,
或者該事件對應得RoutedEventArgs.Handled=true時,完成處理。該事件僅Windows 8支援。
直接路由事件(Direct Routing Event),該事件沒有向上或者向下傳播擴散,僅作用於當前啟用事件的對象上。該事件可被Windows 8,Silverlight支援。
常見的標記延伸
Binding 標記延伸
{Binding}提供一個data-bound屬性值,使該值可延遲到運行時。綁定標記延伸會在XAML 載入時轉換為一種中間運算式對象。資料繫結引擎在運行時使用運算式和資料內容來確定屬性值。
CustomResource 標記延伸
通過計算對一個來源於自訂資源尋找實現的資源的引用,為任何XAML屬性提供一個值。資源尋找是通過CustomXamlResourceLoader類實現執行的。
RelativeSource 標記延伸
提供一種方式,在運行時對象圖中以相對關係形式指定綁定來源。
StaticResource 標記延伸
通過計算對一個已定義資源的引用,為任何XAML屬性提供一個值。資源在一個ResourceDictionary中定義,一種StaticResource用法在ResourceDictionary中引用該資源的鍵。
TemplateBinding 標記延伸
將一個控制項範本中的屬性值連結到模板控制項上其他某個公開的屬性的值。TemplateBinding只能在XAML中的一個ControlTemplate定義中使用。
ThemeResource 標記延伸
使用根據當前處於活動狀態的主題檢索不同資源的附加系統邏輯,通過計算對某個資源的引用來為任何XAML屬性提供值。與StaticResource類似,資源是在ResourceDictionary中定義的,並且ThemeResource用法引用ResourceDictionary中的該資源的鍵。
Windows Phone 一、XAML基礎文法