經過對前面2節對XAML的介紹,咱們對XAML有了必定的認識。這一節咱們來簡單瞭解一下部分XAML命名空間(x:)語言功能。ide
x命名空間映射的是http://schemas.microsoft.com/winfx/2006/xaml,它包含的類與解析XAML語言相關。與C#語言同樣,XAML也有本身的編譯器。XAML文檔會被解析並編譯,最終造成IL存儲在程序集中。在解析和編譯XAML的過程當中,咱們須要告訴編譯器一些信息,好比XAML代碼編譯結果與那個C#代碼的編譯結果合併等。這些能讓咱們與XAML編譯器溝通的工具就放在x名稱空間中。工具
經過x命名空間在XAML中出現的形式,咱們能夠分爲以下幾類:ui
· Attributethis
· 標記擴展spa
· XAML指令元素3d
接下來咱們就來介紹一下其中主要的功能。code
一. x命名空間中的Attributeorm
1. x:Classxml
這個Attribute的做用是告訴XAML編譯器將XAML標籤的編譯結果與後臺代碼中指定的類合併。語法爲:對象
<object x:Class="namespace.classname"...> ... </object>
這個Attribute只能用於根節點
namespace可填。指定一個包含由 classname 標識的分部類的 CLR 命名空間。 若是指定了 namespace,則用一個點 (.) 來分隔 namespace 和 classname。
classname必填。而且必須與該代碼隱藏相鏈接的分部類的名稱對應。而且代碼隱藏相鏈接的類必須使用部分類,也就是partial關鍵字修飾。
2. x:ClassModifier
在同時提供了 x:Class 的狀況下,修改 XAML 編譯行爲,告訴由標籤生成的類具備怎樣的訪問控制級別。
使用時必須注意:
· 必須同時具備x:Class
· 必須與x:Class所指示類的訪問控制級別一致。分爲public(默認的)和internal2種。
3. x:Name
若是咱們經過XAML聲明瞭一個元素,XAML編譯器會爲咱們生成一個與該元素對應的對象。可是若是咱們想在代碼中找到該元素並使用,就必須爲該對象聲明一個引用類型的變量。這個時候x:Name就派上用場了。
它具備2個做用:
· 告訴XMAL編譯器,當一個標籤元素帶有x:Name時,除了要生成對應的實例,還要生成一個引用類型的變量,這個變量名就是x:Name的值。
· 講生成對象的Name屬性(若是有)也設置成x:Name的值,並把這個值註冊到UI樹上,方便查找。
在XAML中,必須爲類聲明瞭RuntimeNameProperty特性才能使用Name,它和x:Name是等效的。
咱們查看StackPanel的源代碼,發如今間接基類FrameworkElement中,使用了RuntimeNameProperty("Name")特性,全部在使用XAML的時候纔有Name屬性。
咱們不能同時設置Name和x:Name。最好使用x:Name,由於有的元素沒有Name這個Attribute,而且x:Name的功能覆蓋了Name的功能。
4. x:FileModifier
在使用x:Name後,XAML元素對應的實例就有了本身的引用類型的變量,這些變量都是類的字段。這些字段的訪問級別默認都是internal的,若是咱們想改變他的訪問級別,就可使用x:FileModifier。
須要注意的一點就是x:FileModifier,必需要和x:Name(或Name)一塊兒使用。
5. x:key
在XAML中,咱們能夠把須要屢次使用的內容提取出來放在資源字典中,須要使用這個資源字典的時候就要使用它的key檢索出來。語法爲:
<object x:Key="stringKeyValue".../> -or- <object x:Key="{markupExtensionUsage}".../>
第一種是要用做鍵的文本字符串。 文本字符串必須符合XamlName語法。
第二種是使用標記擴展。
在XAML中定義的資源的x:key,一樣可使用this.FindResource("keyName")方法在代碼隱藏文件中訪問。
6. x:Shared
該Attribute必須和x:key同時使用。當咱們把某些對象做爲資源放進資源字典後,能夠把它檢索出來反覆使用。那麼當咱們每次檢索的時候,是同一個對象,仍是多個對象的副本就須要設置x:Shared的值。默認值爲true,當設置成false的時候,會修改 WPF 資源檢索行爲,以便特性化資源請求爲每一個請求建立一個新實例,而不是全部請求共享同一個實例。
二. 標記擴展
1. x:Type
通常狀況下咱們操做的是數據類型的實例或者引用,可是有時候須要使用x:Type來操做數據類型自己。
<Style TargetType="{x:Type TextBlock}"> <Setter Property="FontFamily" Value="Segoe Black" /> <Setter Property="HorizontalAlignment" Value="Center" /> <Setter Property="FontSize" Value="12pt" /> <Setter Property="Foreground" Value="#777777" /> </Style>
上面這個例子就是操做TextBlock控件,並設置他的樣式。
2. x:Null
在C#代碼中,咱們使用null來表示空值,可是在XAML中使用x:Null.
好比上面一段示例代碼定義了TextBlock的樣子,咱們還能夠在代碼裏面設置它,讓他爲空來覆蓋這個樣式資源。
<TextBlock Style="{x:Null}">OK</TextBlock>
3. x:Array
它的做用就是經過它的Items(只讀)屬性,向使用者暴露一個類型已知的ArrayList實例,ArrayList內成員類型由Type屬性指明。
<ListBox Margin="5"> <ListBox.ItemsSource> <x:Array Type="system:String"> <system:String>A</system:String> <system:String>B</system:String> </x:Array> </ListBox.ItemsSource> </ListBox>
咱們不能設置ItemsSource="{x:Array Type=system:String,Items=xxxx},由於Items是一個只讀屬性。
上面的例子,咱們就是使用屬性元素的方式來聲明的。在解析的時候,會調用ArrayExtension源代碼中的AddChild方法,把A,B添加到Items裏。
4. x:Static
它的做用是訪問一個static類型的屬性或者字段。
三. XAML指令元素
只有x:Code、x:XData
前面已經講過x:Code,咱們來看看x:XData。WPF中巴包含數據源的對象稱爲數據源,用於把數據源中的數據提供給使用者的對象稱爲數據提供者。WPF類庫中包含許多數據提供者,其中一個是XmlDataProvider,專門用於提供XML化的數據。咱們經過一個例子就明白了:
<Window.Resources> <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books"> <x:XData> <Inventory xmlns=""> <Books> <Book ISBN="0-7356-0562-9" Stock="in" Number="9"> <Title>XML in Action</Title> <Summary>XML Web Technology</Summary> </Book> <Book ISBN="0-7356-1370-2" Stock="in" Number="8"> <Title>Programming Microsoft Windows With C#</Title> <Summary>C# Programming using the .NET Framework</Summary> </Book> <Book ISBN="0-7356-1288-9" Stock="out" Number="7"> <Title>Inside C#</Title> <Summary>C# Language Programming</Summary> </Book> <Book ISBN="0-7356-1377-X" Stock="in" Number="5"> <Title>Introducing Microsoft .NET</Title> <Summary>Overview of .NET Technology</Summary> </Book> <Book ISBN="0-7356-1448-2" Stock="out" Number="4"> <Title>Microsoft C# Language Specifications</Title> <Summary>The C# language definition</Summary> </Book> </Books> <CDs> <CD Stock="in" Number="3"> <Title>Classical Collection</Title> <Summary>Classical Music</Summary> </CD> <CD Stock="out" Number="9"> <Title>Jazz Collection</Title> <Summary>Jazz Music</Summary> </CD> </CDs> </Inventory> </x:XData> </XmlDataProvider> </Window.Resources> <StackPanel> <ListBox Width="500" Height="300" Background="Honeydew"> <ListBox.ItemsSource> <Binding Source="{StaticResource InventoryData}" XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/> </ListBox.ItemsSource> </ListBox> </StackPanel>
咱們在資源中經過x:XData定義了一個XML的數據源,並經過XmlDataProvider提供給使用者ListBox.