1. 程式人生 > >C#中WPF程式的XAML名稱空間理解

C#中WPF程式的XAML名稱空間理解

一、什麼是名稱空間

        XAML 名稱空間實際上是 XML 名稱空間概念的擴充套件。 指定 XAML 名稱空間的技術依賴於 XML 名稱空間語法、使用 URI 作為名稱空間識別符號的約定、使用字首提供從同一標記源中引用多個名稱空間的方法,諸如此類。XML 名稱空間的 XAML 定義中增加的主要概念是:XAML 名稱空間既暗指標記用法的唯一性範圍,也影響特定 CLR 名稱空間和引用的程式集對標記實體的潛在支援方式。後一種考慮因素也受到 XAML 架構上下文的概念的影響。 但對於 WPF 使用 XAML 名稱空間的方式而言,您通常可以將 XAML 名稱空間認為是預設 XAML 名稱空間、XAML 語言名稱空間,以及 XAML 標記直接對映到特定支援 CLR 名稱空間和引用程式集的任何進一步的 XAML 名稱空間。

二、XAML名稱空間的分類

1、xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"       

      首先,xmlns在XML檔案中是一個特殊的特性,它的值並不是一個網址,之所以寫成網址這樣的形式,是為了規範化,因為schemas.microsoft.com是微軟專有的,這樣就避免了因為名稱空間的不統一性造成的相關錯誤,這個名稱空間其實跟C#裡面的名稱空間是一個意思,只是C#裡面名稱空間有很多,WPFF中會使用到的名稱空間也各有不同,因此,他把整個WPF中核心名稱空間全部放在上面這個名稱空間裡面,這樣方便統一管理。

2、xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

     該名稱空間稱之為“XAML名稱空間,而且將它對映為x:字首,為什麼還要引入這個名稱空間呢,這是因為,在XML文件中,XML元素是由開發者自己定義的,那麼當兩個不同的開發者定義了一個同名的元素該怎麼辦呢,這時候就需要XML名稱空間去判斷相同的元素到底是哪一個名稱空間裡面的元素了。由此可見,它的含義與C#,C++裡面的名稱空間其實是一樣的。

      但是他又有自己的特殊性,那是因為WPF中XAML與C#一樣,也有自己獨立的編譯器。XAML會被解析和編譯,最終形成微軟的中間語言儲存在程式集中。在解析和編譯XAML的語言過程中,我們經常需要告訴編譯器一些重要的資訊,比如XAML程式碼的編譯結果應該與哪個C#程式碼的編譯器合併、使用XAML宣告的元素師public還是private訪問級別等等。這些讓程式設計師能夠與XAML編譯器溝通的工具就存在x名稱空間中。這個名稱空間的主要作用在於通過x空間的成員告訴編譯器怎麼編譯XAML,生成什麼類名,屬性的可訪問性等。

三、XML名稱空間的分類

1、Attribute

2、標記拓展

3、XAML指令元素

下面我們開始根據分類來看一看它們各自的作用和主要使用方法

1、Attribute

Attribute是語言層面的東西,是給XAML編譯器看的,Property是面向物件層面的東西,是給程式設計邏輯用的。在使用XAML程式設計的時候,如果你想給他加上一些特殊的標記從而影響XAML編譯器對他的解析,那麼就要對他新增一些Attribute。(詳細資訊可以參考我的另一篇文章C#的WPF程式設計中的Attribute)

常用的一些Attribute

x:Class

這個Attribute主要告訴XAML編譯器,編譯的XAML將和哪一個類合併。

使用x:Class要注意:這個Attribute只能用於根節點,指向的類必須使用關鍵字partial

x:ClassModifier

這個Attribute主要告訴XAML編譯器,有標籤編譯生成的類具有怎樣的訪問控制級別。

x:Name

這個就如winform中的ID一樣

x:FieldModifier

這個就是用來在XAML裡改變引用變數訪問級別的

x:Key

最自然的檢索方式莫過於使用"Key-Value"對的形式了。在XAML檔案中,我們可以把很多需要多次使用的內容提取出來放在資源字典中,需要用到的時候就用這個Key把它檢索出來。

x:Shared

在學習使用x:key時我們已經知道,一旦我們把某些物件當做資源放進資源字典裡後就可以把他們檢索出來重複使用,那麼,每當他們檢索到一個物件時,我們得到的究竟是同一個物件呢,還是這個物件的多個副本?這就要看x:Shared怎麼設定了,預設為true,我們得到的是同一個物件。如果是false,那麼我們得到的是這個物件的一個新副本。

總結:由於在一個標籤中的標籤的Attribute大部分對應.NET物件的Property。在使用XAML程式設計的時候,如果你想給它加一點特殊的標記來改變XAML對它的解析,這時候就需要額外的給它新增一些Attribute了

2、標記拓展

標記擴充套件實際就是一些MarkupExtension類的直接或間接派生類。x名稱空間中就包含一些這樣的類,所以稱其為x名稱空間標籤的標記擴充套件。(詳細使用方法請參見我的另外一篇文章,C#的WPF程式設計中的標記拓展)

x:Type

顧名思義,x:Type的值是一個數據型別的名稱。程式設計中也會用到資料型別本身。

x:Null

在c#語言裡,我們用null關鍵字來表示空值,在XAML裡我們就用x:Null來表示空值。

x:Array

x:Array的作用就是通過它的Items屬性向使用者暴露一個型別已知的ArrayList例項,ArrayList的成員型別由x:Array的Type指明。

x:Static

在XAML文件中使用資料型別的static成員

3、XAML指令元素

x:Code

x:Code可以將邏輯程式碼放到XAML中執行

x:XData

那就是資料來源了,在該標籤內的內容可以作為資料來源使用

這就是x空間裡所有的東西了