Share via


.NET XAML 服務的 XAML 命名空間

XAML 命名空間是擴充 XML 命名空間定義的概念。 類似于 XML 命名空間,您可以使用標記中的屬性來定義 XAML 命名空間 xmlns 。 XAML 命名空間也會在 XAML 節點資料流程和其他 XAML 服務 API 中表示。 本主題定義 XAML 命名空間概念,並描述 XAML 架構內容和 .NET XAML 服務的其他層面如何定義和使用 XAML 命名空間。

XML 命名空間和 XAML 命名空間

XAML 命名空間是特製化的 XML 命名空間,就像 XAML 是 XML 的特殊形式,並使用其標記的基本 XML 形式一樣。 在標記中,您可以透過 xmlns 套用至元素的屬性來宣告 XAML 命名空間及其對應。 宣告 xmlns 可以做為 XAML 命名空間在 中宣告的相同專案。 對專案進行的 XAML 命名空間宣告對該專案、該專案的所有屬性以及該專案的所有子系都是有效的。 屬性可以使用與包含屬性的專案不同之 XAML 命名空間,只要屬性名稱本身在標記中參考前置詞做為其屬性名稱的一部分。

XAML 命名空間與 XML 命名空間的區別在於 XML 命名空間可用來參考架構,或只是為了區分實體。 針對 XAML,XAML 中使用的類型和成員最終必須解析為支援類型,而且 XML 架構概念不適用於這項功能。 XAML 命名空間包含 XAML 架構內容必須具備的資訊,才能執行此類型對應。

XAML 命名空間元件

XAML 命名空間定義有兩個元件:前置詞和識別碼。 當 XAML 命名空間在標記中宣告或定義于 XAML 類型系統中時,每個元件都會存在。

前置詞可以是 XML 1.0 規格 中 W3C 命名空間所允許 的任何字串。 根據慣例,前置詞通常是短字串,因為前置詞在一般標記檔案中重複多次。 某些要用於多個 XAML 實作的 XAML 命名空間會使用特定的傳統前置詞。 例如,XAML 語言 XAML 命名空間通常會使用前置詞 x 來對應。 您可以定義預設的 XAML 命名空間,其中定義中未指定前置詞,但如果已定義或查詢 BY.NET XAML 服務 API,則會以空字串表示。 一般而言,會刻意選擇預設的 XAML 命名空間,以便藉由 XAML 實作技術及其案例和詞彙來提升前置詞省略標記的最大化數量。

識別碼可以是 XML 1.0 規格 中 W3C 命名空間所允許 的任何字串。 根據慣例,XML 命名空間或 XAML 命名空間的識別碼通常會以 URI 形式提供,通常是通訊協定限定的絕對 URI。 通常,定義特定 XAML 詞彙的版本資訊會隱含為路徑字串的一部分。 XAML 命名空間會在 XML URI 慣例之外新增額外的識別碼慣例。 針對 XAML 命名空間,識別碼會傳達 XAML 架構內容所需的資訊,以便解析該 XAML 命名空間下指定為元素的類型,或將屬性解析為成員。

為了將資訊傳達給 XAML 架構內容,XAML 命名空間的識別碼可能仍為 URI 格式。 不過,在此情況下,URI 也會宣告為特定元件或元件清單中的相符識別碼。 這在元件中完成,方法是使用 XmlnsDefinitionAttribute 來將元件歸結。 .NET XAML 服務中的預設 XAML 架構內容支援識別 XAML 命名空間和支援以 CLR 為基礎的型別解析行為的方法。 更一般而言,這個慣例可用於 XAML 架構內容併入 CLR 或以預設 XAML 架構內容為基礎的情況,這是從 CLR 元件讀取 CLR 屬性的必要條件。

XAML 命名空間也可以透過通訊 CLR 命名空間和型別定義元件的慣例來識別。 如果元件中沒有 XmlnsDefinitionAttribute 包含類型的屬性,則會使用這個慣例。 此慣例可能比 URI 慣例更為複雜,而且也可能有模棱兩可和重複的可能性,因為有多種方式可參考元件。

使用 CLR 命名空間和元件慣例之識別碼的最基本形式如下:

clr-namespace:clrnsName; assembly=assemblyShortName

clr-namespace:; assembly= 是語法的常值元件。

clrnsName 是識別 CLR 命名空間的字串名稱。 此字串名稱包含任何內部點字元 (.) ,提供 CLR 命名空間及其與其他 CLR 命名空間相關的提示。

assemblyShortName 是定義在 XAML 中有用的型別的元件字串名稱。 要透過宣告的 XAML 命名空間存取的類型應該由元件定義,而且必須在 clrnsName 指定的 CLR 命名空間內宣告。 此字串名稱通常會平行處理 所 AssemblyName.Name 報告的資訊。

CLR 命名空間和元件慣例的更完整定義如下:

clr-namespace:clrnsName; assembly=assemblyName

assemblyName 代表任何合法做為輸入的 Assembly.Load(String) 字串。 此字串可以包含文化特性、公開金鑰或版本資訊(這些概念的定義是在 的 Assembly 參考主題中定義)。 COFF 格式和辨識項(如 其他 多載 Load 所使用的)與 XAML 元件載入目的無關;所有載入資訊都必須以字串形式呈現。

為元件指定公開金鑰是 XAML 安全性的實用技術,或移除可能模棱兩可的模棱兩可,如果元件是透過簡單名稱載入,或預先存在於快取或應用程式域中。 如需詳細資訊,請參閱 XAML 安全性考慮

XAML 服務 API 中的 XAML 命名空間宣告

在 XAML 服務 API 中,XAML 命名空間宣告是由 NamespaceDeclaration 物件表示。 如果您要在程式碼中宣告 XAML 命名空間,則會呼叫 建 NamespaceDeclaration(String, String) 構函式。 nsprefix 參數會指定為字串,而提供這些參數的輸入會對應至本主題先前提供的 XAML 命名空間識別碼和 XAML 命名空間前置詞的定義。

如果您要檢查 XAML 命名空間資訊作為 XAML 節點資料流程的一部分,或透過其他 XAML 類型系統的存取, NamespaceDeclaration.Namespace 請報告 XAML 命名空間識別碼,並 NamespaceDeclaration.Prefix 報告 XAML 命名空間前置詞。

在 XAML 節點資料流程中,XAML 命名空間資訊可以顯示為它所套用實體前面的 XAML 節點。 這包括 XAML 命名空間資訊在 XAML 根項目的 前面 StartObject 的情況。 如需詳細資訊,請參閱 Understanding XAML Node Stream Structures and Concepts

對於使用 .NET XAML 服務 API 的許多案例,至少應該有一個 XAML 命名空間宣告存在,而且宣告必須包含或參考 XAML 架構內容所需的資訊。 XAML 命名空間必須指定要載入的元件,或協助解析已載入或由 XAML 架構內容所知道之命名空間和元件內的特定類型。

若要產生 XAML 節點資料流程,必須透過 XAML 架構內容取得 XAML 類型資訊。 不需要先判斷每個要建立之節點的相關 XAML 命名空間,就無法判斷 XAML 類型資訊。 此時,尚未建立類型實例,但 XAML 架構內容可能需要從定義元件和備份類型查閱資訊。 例如,為了處理標記 <Party><PartyFavor/></Party> ,XAML 架構內容必須能夠判斷 的名稱和型 PartyContentProperty 別,因此也必須知道 和 PartyFavor 的 XAML 命名空間資訊 Party 。 在預設 XAML 架構內容的情況下,靜態反映會報告在節點資料流程中產生 XAML 類型節點所需的大部分 XAML 類型系統資訊。

若要從 XAML 節點資料流程產生物件圖形,XAML 命名空間宣告必須存在於原始標記中使用的每個 XAML 前置詞,並記錄在 XAML 節點資料流程中。 此時會建立實例,而且會發生真正的類型對應行為。

如果您需要預先填入 XAML 命名空間資訊,在您想要 XAML 架構內容使用的 XAML 命名空間未在標記中定義的情況下,您可以使用的其中一個技巧是針對 XmlReader 宣告 中的 XmlParserContext XML 命名空間宣告。 然後使用該 XmlReader 做為 XAML 讀取器建構函式的輸入,或 XamlServices.Load(XmlReader)

其他兩個與 .NET XAML 服務中 XAML 命名空間處理相關的 API 是 屬性 XmlnsDefinitionAttributeXmlnsPrefixAttribute 。 這些屬性適用于元件。 XmlnsDefinitionAttribute 由 XAML 架構內容用來解譯任何包含 URI 的 XAML 命名空間宣告。 XmlnsPrefixAttribute 是由發出 XAML 的工具所使用,讓特定 XAML 命名空間可以使用可預測的前置詞序列化。 如需詳細資訊,請參閱 自訂類型和程式庫 的 XAML 相關 CLR 屬性。

另請參閱