很多書本,部落格等對x命名空間詳解介紹不是很詳細,而且例子也不多,這裡就為大家好好介紹一把,XAML2009 主要新功能也介紹一下,不正确之處還請指正。
x命名空間映射的是http://schemas.microsoft.com/winfx/2006/xaml,可以猜測,它包含的類應該與解析XAML語言有關,也稱為XAML命名空間。
與C#語言一樣,XAML也有自己的編譯器。XAML語言會被解析并編譯,最終形成微軟中間語言存儲在程式集中。在解析和編譯XAML語言過程中,我們需要告訴編譯器一些重要的資訊,比如XMAL代碼的編譯異結果應該和哪個C#代碼的編譯結果合并、使用XAML聲明的元素是public還是private通路級别等等。這些讓程式員能夠與XAML編譯器溝通的工具就存放在x命名空間中。
1. x命名空間中的Attribute
1.1 x:Class
作用:告訴XAML編譯器将XAML标簽的編譯結果與背景代碼中指定的類合并。
注意點:
- 該Attribute隻能用于根節點。
- 使用x:Class的根節點的類型要與x:Class的值所訓示的類型保持一緻。
- x:Class的值所訓示的類型在聲明時必須使用partial關鍵字。
1.2 x:ClassModifier
作用:告訴XAML編譯由标簽編譯生成的類具有怎樣的通路控制級别。預設值為public,假如x:Class中所對應的背景代碼中的類為internal修飾,則需要使用此Attribute。
.NET 架構 XAML 服務使用中 x:ClassModifier 的值中随不同的程式設計語言而不同。 C#中, TypeAttributes.Public 和 TypeAttributes.NotPublic 對應public和internal。
1.3 x:Subclass
作用:在同時提供了 x:Class 的情況下,修改 XAML 标記編譯行為。不必根據 x:Class 類建立分部類,而是将提供的 x:Class 建立為中間類,然後提供的派生類應基于 x:Class。
x:Subclass 用法主要針對不支援分部類聲明的語言。
使用例子:
<Window x:Class="WpfApplication2.MainWindow"
x:Subclass="WpfApplication2.MainWindowSub"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:ClassModifier="internal"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Label x:Name="lbl" Content="123" />
</Grid>
</Window>
背景代碼:
namespace WpfApplication2
{
internal class MainWindowSub : WpfApplication2.MainWindow
{
public MainWindowSub()
: base()
{
InitializeComponent();
lbl.Content = "321";
}
}
}
1.4 x:Name
作用: a. 告訴XAML編譯器,當一個标簽帶有 x:Name 時除了為這個标簽生成對應執行個體外還要為這個執行個體聲明一個引用變量,變量名就是 x:Name 的值。 b. 将XAML标簽所對應對象的Name屬性(如果有)也設為x:Name的值,并把這個值注冊到UI樹上,以便查找。
執行 InitializeComponent 使通過 x:Name /字段名稱直接而非必須顯式地調用FindName 在任何需要引用 XAML 定義對象的時候可以引用運作時對象圖。
x:Name和Name
許多 WPF 應用程式方案都可以完全避免使用 x:Name 特性,因為在預設 XAML 命名空間内為幾個重要基類(如 FrameworkElement 和 FrameworkContentElement)指定的 Name 依賴項屬性也具有此用途。 當代碼在架構級通路具有非 Name 屬性的元素時,仍存在一些常見的 XAML 和 WPF 方案。 例如,某些動畫和示範圖闆支援類不支援 Name 屬性,但為了控制動畫經常需要引用代碼。 應當在時間線以及在 XAML 中建立的變換上将 x:Name 指定為屬性,前提是您計劃以後在代碼中引用它們。
1.5 x:FieldModifier
作用:修改 XAML 編譯行為。XAML中聲明類或其成員的正常通路級别為internal,如需修改為public,需要設定此值。
因為x:FieldModifier是用來改變引用變量通路級别的,是以使用x:FieldModifier的前提是這個标簽同時也使用x:Name,不然怎麼引用呢?
測試:
<StackPanel>
<Label x:Name="lbl" Content="123" />
<Label x:Name="lbl2" x:FieldModifier="public" />
</StackPanel>
效果: 其他 dll 通路時,僅能通路 lbl2 。
1.6 x:Key
作用:資源中用于檢索的索引。(Key-Value模式)
在 XAML 2006 和 WPF 中,必須以特性形式提供 x:Key。 您仍可以使用非字元串鍵,但這需要标記擴充用法來提供特性窗體中的非字元串值。 如果使用 XAML 2009,則 x:Key 可以被指定為顯式支援以對象類型而不是字元串為鍵的詞典而不需要标記擴充中間語言。
注意:在 WPF 中,可以使用 XAML 2009 功能,但僅針對未進行标記編譯的 XAML。 WPF 的已編譯标記的 XAML 以及 XAML 的 BAML 形式目前不支援 XAML 2009 關鍵字和功能。
下面用XamlReader來實作XAML2009功能:
string strXaml = "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"" +
" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"> "+
" <Label Content=\"XAML2009\">"+
" <x:Key>"+
" <x:String>xaml2009</x:String>"+
" </x:Key>"+
" </Label>"+
"</ResourceDictionary>";
StringReader strreader = new StringReader(strXaml);
XmlTextReader xmlreader = new XmlTextReader(strreader);
object obj = XamlReader.Load(xmlreader);
this.Resources.MergedDictionaries.Add((ResourceDictionary)obj);
XAML中引用:
<Label x:Name="lbl" Content="{DynamicResource xaml2009}" />
1.7 x:Shared
作用:當設定為 false 時,會修改 WPF 資源檢索行為,以便特性化資源請求為每個請求建立一個新執行個體,而不是所有請求共享同一個執行個體。預設值為true。
舉例:在x:Shared="true"情況下,在多個元素引用某一資源時,如果某一個元素更改了該資源,則其他元素也會跟着修改。
資源:
<SolidColorBrush x:Key="color" x:Shared="true" Color="Red"/>
<SolidColorBrush x:Key="bcolor" x:Shared="false" Color="Gray"/>
引用:
<Label Content="x:Shared" Foreground="{DynamicResource color}" Background="{DynamicResource bcolor}"/>
<Label x:Name="lblShared" Content="x:Shared" Foreground="{DynamicResource color}" Background="{DynamicResource bcolor}"/>
<Button x:Name="btn" Content="更改顔色" Click="btn_Click"/>
按鈕代碼:
internal override void btn_Click(object sender, RoutedEventArgs e)
{
//更改Foreground
SolidColorBrush brush = this.lblShared.Foreground as SolidColorBrush;
brush.Color = Colors.Blue;
//更改Background
brush = this.lblShared.Background as SolidColorBrush;
brush.Color = Colors.Yellow;
}
效果:
點選按鈕後
1.8 x:Uid
作用:标記元素提供唯一的辨別符。 在許多情況下,此唯一辨別符由 XAML 本地化過程和工具使用。
詳細介紹将在WPF全球化中進行。
2. x命名空間中的标記擴充
2.1 x:Type
作用:提供 CLR Type 對象,該對象是指定的 XAML 類型的基礎類型。
在樣式、模闆等中指定TargetType或者資料綁定中使用RelativeSource的FindAncestor模式都會用到x:Type。
2.2 x:TypeArguments
作用:将泛型的限制類型參數傳遞給泛型類型的構造函數。
x:TypeArguments在XAML2006中的限制:
- 僅有 XAML 檔案的根元素可以支援引用泛型類型的泛型 XAML 用法。
- 根元素必須映射到至少具有一個類型參數的泛型類型。 一個示例是 PageFunction<T>。 這些頁面函數是用于 WPF 中的 XAML 泛型用法支援的主要方案。
- 用于泛型的根元素 XAML 對象元素必須也使用 x:Class聲明一個分部類。 即使定義了 WPF 生成操作,這也為 true。
- x:TypeArguments 不能引用嵌套的泛型限制。
XAML2009中,可以執行個體化泛型對象元素,可以支援後備類型系統和對象模型的 XAML 标記中的任何位置處。
XAML2009功能舉例:
string strXaml = "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"" +
" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" " +
" xmlns:scg=\"clr-namespace:System.Collections.Generic;assembly=mscorlib\"> " +
" <scg:List x:Key=\"list\" x:TypeArguments=\"x:String\">" +
" <x:String>XAML2009</x:String>" +
" </scg:List>" +
"</ResourceDictionary>";
StringReader strreader = new StringReader(strXaml);
XmlTextReader xmlreader = new XmlTextReader(strreader);
object obj = XamlReader.Load(xmlreader);
this.Resources.MergedDictionaries.Add((ResourceDictionary)obj);
引用:
<ComboBox ItemsSource="{DynamicResource list}"/>
效果(看下拉框):
2.3 x:Null
作用:将 null 指定為 XAML 成員的值。
x:Null多用于樣式等控制,使某些元素的樣式不受通用顔色控制等。
2.4 x:Array
作用:通過它的Items屬性向使用者暴露一個類型已知的ArrayList執行個體,ArrayList内成員的類型由x:Array的Type指明。
使用代碼示例如下:
<ComboBox>
<ComboBox.ItemsSource>
<x:Array Type="sys:String">
<sys:String>XMAL2006</sys:String>
</x:Array>
</ComboBox.ItemsSource>
</ComboBox>
2.5 x:Static
作用:在XAML文檔中使用資料類型為static的成員(包括常量、靜态屬性、字段或枚舉值)。
定義靜态字段:
public static string strStatic = "我是靜态字段";
引用:
<Label Content="{x:Static local:MainWindowSub.strStatic}"/>
2.6 x:Reference(XAML2009)
作用:引用在 XAML 标記中其他地方聲明的執行個體。和{Binding ElementName="..."}的作用類似。
個人發現的差別就是x:Reference能使用于非依賴屬性。
注意:x:Reference 是 XAML 2009 中定義的一個構造。在 WPF 中,可以使用 XAML 2009 功能,但僅針對未進行 WPF 标記編譯的 XAML。
事實上,x:Reference能在用在進行WPF标記編譯的XAML中,帶上編譯器(VS2013)錯誤清單會提示“未将對象引用設定到對象的執行個體。”的錯誤(因為x:Reference引用的對象在設計的時候還沒有執行個體化),設計界面無效果(如下圖),但是能編譯成功,運作也是可以的。
代碼:
<Button x:Name="btnXAML" Content="{}{x:Reference}" Style="{x:Null}" Foreground="Red"/>
<!--x:Reference與{Binding ElementName="..."}的差別:x:Reference可以适用于非依賴屬性-->
<!--使用-->
<Label Content="Binding ElementName="...""
Foreground="{Binding ElementName=btnXAML,Path=Foreground}"/>
<Label Content="使用x:Reference"
Foreground="{Binding Source={x:Reference btnXAML},Path=Foreground}"/>
效果:
3. XAML指令元素
3.1 x:Code
作用:允許在 XAML 生産内放置代碼。
示例:
<Window x:Class="WpfApplication2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
<Button Content="内置代碼" Click="codeinside"/>
</StackPanel>
<x:Code>
<![CDATA[
private void codeinside(object sender, System.Windows.RoutedEventArgs e)
{
MessageBox.Show("内置代碼測試");
}
]]>
</x:Code>
</Window>
3.2 x:Xdata
作用:x:XData标簽是一個專用标簽。WPF中把包含資料的對象稱為資料源,用于把資料源中的資料提供給資料使用者的對象被稱為資料提供者(Data Provider)。WPF類庫中包含多種資料提供者,其中有一個類叫XmlDataProvider,專門用于提供XML化的資料。如果想在XAML裡聲明一個帶有資料的XmlDataProvider執行個體,那麼XmlDataProvider執行個體的資料就要放在x:Xdata 标簽的内容裡。
定義資源:
<XmlDataProvider x:Key="InventoryData" XPath="Inventory/students">
<x:XData>
<Inventory xmlns="">
<students>
<Student age="18">
<id>01</id>
<name>小麗</name>
</Student>
<Student age="17">
<id>02</id>
<name>小明</name>
</Student>
</students>
</Inventory>
</x:XData>
</XmlDataProvider>
使用資源:
<DataGrid AutoGenerateColumns="False">
<DataGrid.ItemsSource>
<Binding Source="{StaticResource InventoryData}"
XPath="*[@age>=18] "/>
</DataGrid.ItemsSource>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding XPath=id}" Header="代碼"/>
<DataGridTextColumn Binding="{Binding XPath=name}" Header="名稱"/>
</DataGrid.Columns>
</DataGrid>
效果:
4. XAML2009 中的語言基元
在上面的介紹XAML2009其他功能的時候已經使用到,這裡不在舉例。
4.1 x:Object
對于 CLR 支援,x:Object 基元對應于 Object。
4.2 x:Boolean
對于 CLR 支援,x:Boolean 基元對應于 Boolean。
XAML 分析 x:Boolean 的值時不區分大小寫。 請注意 x:Bool 不是可接受的備選基元。
4.3 x:Char
對于 CLR 支援,x:Char 基元對應于 Char。
4.4 x:String
對于 CLR 支援,x:String 基元對應于 String。
4.5 x:Decimal
對于 CLR 支援,x:Decimal 基元對應于 Decimal。
4.6 x:Single
對于 CLR 支援,x:Single 基元對應于 Single。
除了數值之外,x:Single 的文本文法還允許使用标記 Infinity、-Infinity 和 NaN。 這些标記視為區分大小寫。
x:Single 支援采用科學記數法格式的值,條件是文本文法中的第一個字元為 e 或 E。
4.7 x:Double
對于 CLR 支援,x:Double 基元對應于 Double。
除了數值之外,x:Double 的文本文法還允許使用标記 Infinity、-Infinity 和 NaN。 這些标記視為區分大小寫。
x:Double 支援采用科學記數法格式的值,條件是文本文法中的第一個字元為 e 或 E。
4.8 x:Int16
對于 CLR 支援,x:Int16 基元對應于 Int16,并且 x:Int16 視為帶符号。 在 XAML 中,文本文法中沒有加号 (+) 表示是一個帶符号的正值。
4.9 x:Int32
對于 CLR 支援,x:Int32 基元對應于 Int32。 x:Int32 視為帶符号。 在 XAML 中,文本文法中沒有加号 (+) 表示是一個帶符号的正值。
4.10 x:Int64
對于 CLR 支援,x:Int64 基元對應于 Int64。 x:Int64 視為帶符号。 在 XAML 中,文本文法中沒有加号 (+) 表示是一個帶符号的正值。
4.11 x:TimeSpan
對于 CLR 支援,x:TimeSpan 基元對應于 TimeSpan。
請注意,時間日期格式的 XAML 分析本質上在 en-US 區域性設定下進行。
4.12 x:Uri
對于 CLR 支援,x:Uri 基元對應于 Uri。
檢查協定不是 x:Uri 的 XAML 定義的一部分。
4.13 x:Byte
對于 CLR 支援,x:Byte 基元對應于 Byte。 Byte / x:Byte 視為無符号。
4.14 x:Array
對于 CLR 支援,x:Array 基元對應于 Array。
可以在 XAML 2006 中使用标記擴充文法定義一個數組;而 XAML 2009 文法是語言定義的基元,不需要通路标記擴充。
5. 其他
還有一些WPF中很少用的這裡就不做介紹了。
x:Members,x:Member,x:Property等在WF中使用較多。
還有xml:lang,xml:space。
XAML2009中的新指令:x:Arguments,x:FactoryMethod
另外使用一對大括号({})進行轉義在WPF基礎知識中已經介紹。
注意:在 WPF 中,可以使用 XAML 2009 功能,但僅針對未進行 WPF 标記編譯的 XAML。 标記編譯的 XAML 以及BAML 形式的 XAML 目前不支援 XAML 2009 關鍵字和功能。 而x:Reference是個例外,其他的新特征在測試時都是通過XamlReader進行的。
代碼
作者:FoolRabbit
出處:http://blog.csdn.net/rabbitsoft_1987
歡迎任何形式的轉載,未經作者同意,請保留此段聲明!