天天看點

XAML 命名空間和命名空間映射

本主題将介紹大部分 xaml 檔案的根元素中存在的 xml/xaml 命名空間 (xmlns)

映射。它還将介紹如何為自定義類型和程式集生成類似的映射。

無論是其一般用途還是 windows 運作時應用程式設計的應用上,xaml 都用于聲明對象、這些對象的屬性以及表示為層次結構的對象-屬性關系。你在 xaml

中聲明的對象受其他程式設計技術和語言定義的類型庫或其他表示支援。這些庫可能是:

windows 運作時的内置對象集合。這是一個固定的對象集合,從 xaml 通路這些對象使用内部類型映射和激活邏輯。

microsoft 或第三方提供的分布式庫。

該庫表示你的應用包含的以及你的包重新分發的第三方控件的定義。

你自己的庫(屬于你的項目的一部分),它包含部分或所有使用者代碼定義。

支援類型資訊與特定 xaml 命名空間定義相關聯。xaml 架構(如 windows 運作時)可聚合多個程式集和多個代碼命名空間,以映射到單個 xaml

命名空間。這就支援涉及更大的程式設計架構或技術的 xaml 詞彙表概念。xaml 詞彙表可能非常大—例如該引用中為 windows 運作時應用記錄的大部分 xaml

構成單個 xaml 詞彙表。xaml 詞彙表也可擴充:通過向支援代碼定義添加類型來擴充它,進而確定在代碼命名空間(已經用作 xaml

詞彙表的映射的命名空間來源)中包含這些類型。

xaml 處理器在建立運作時對象表示時,可查找與該 xaml 命名空間關聯的支援程式集的類型和成員。出于此原因,xaml

可用作一種形式化和交換對象構造定義行為的方式,并且 xaml 可用作 windows 應用商店應用的 ui 定義技術。

xaml 檔案幾乎總是在其根元素中聲明一個預設 xaml 命名空間。預設 xaml

命名空間定義了無需使用字首來限定即可聲明哪些元素。例如,如果聲明一個元素 <code>&lt;balloon /&gt;</code>,xaml

分析器期望一個 balloon 元素存在并且在預設的 xaml

命名空間中是有效的。相反,如果 balloon 不在已定義的預設 xaml

命名空間中,就必須使用一個字首限定該元素名稱,例如 <code>&lt;party:balloon /&gt;</code>。該字首表明該元素存在于與預設命名空間不同的 xaml 命名空間中,你必須将一個 xaml

命名空間映射到字首 party,然後才能使用此元素。 xaml

命名空間适用于在其上聲明它們的特定元素,也适用于該元素在 xaml 結構中包含的任何元素。出于此原因,xaml 命名空間幾乎總是在 xaml

檔案的根元素上聲明,以充分利用這種繼承性。

在大多數 xaml 檔案的根元素中,有兩個 xmlns 聲明。第一個聲明将一個 xaml

命名空間映射為預設命名空間:<code>xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</code>

這是多個也使用 xaml 作為 ui 定義标記格式的預處理器 microsoft 技術中使用的相同 xaml

命名空間辨別符。使用相同的辨別符是經過深思熟慮的,在将以前定義的 ui 遷移到使用 c++、c# 或 visual basic 的 windows

運作時應用時很有用。

第二個聲明映射 xaml 定義的語言元素的一個獨立的 xaml 命名空間,(通常)将它映射到 "x:"

字首:<code>xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"</code>

此 xmlns 值和它所映射到的 "x:" 字首對于在多個使用 xaml 的前置任務

microsoft 技術中使用的定義也是相同的。

這些聲明之間的關系是,xaml 是一種語言定義,windows 運作時是一種實作,它使用 xaml 作為語言并定義一個特定的詞彙表,它的類型在這裡供

xaml 引用。

xaml 語言指定某些語言元素,其中每個元素應可通過适用于 xaml 命名空間的 xaml 處理器實作進行通路。項目模闆、示例代碼和語言特性文檔遵循

xaml 語言 xaml 命名空間的 "x:" 映射約定。xaml 語言命名空間定義多個常用的功能,甚至對于使用 c++、c# 或 visual basic

的基本 windows 運作時應用,這些功能也是必要的。例如,為了将任何代碼隐藏通過分部類聯接到 xaml 檔案,必須将該類命名為相關 xaml

檔案的根元素中的  屬性。或者,任何在

xaml 頁面中定義為  中一個鍵資源的元素必須在相關的對象元素上設定  特性。

除了預設命名空間和 xaml 語言 xaml 命名空間 "x:",你也可能在 microsoft visual studio 生成的應用的初始預設

xaml 中看到其他的已映射 xaml 命名空間。

"d:" xaml 命名空間旨在提供設計器支援,尤其是 microsoft visual studio 的 xaml 設計界面中的設計器支援。" d:"

xaml 命名空間支援 xaml 元素上的設計器或設計時特性。這些設計器特性隻影響 xaml 行為的設計方面。如果 windows 運作時 xaml

分析器在一個應用運作時加載相同的 xaml,設計器特性會被忽略。一般而言,設計器特性在任何 xaml

元素上是有效的,但在實際情況中,隻有某些場景适合應用設計器特性。具體來講,許多設計器特性是為了在你開發使用資料綁定的 xaml

和代碼時,提供一種與資料上下文和資料源互動的更好體驗。

d:designheight 和 d:designwidth 屬性: 這些屬性有時應用于 visual

studio 或其他 xaml 設計器圖面為你建立的 xaml 檔案的根。例如,如果你向應用項目中添加了新的 ,則這些屬性是針對所建立的

xaml 的usercontrol 根設定的。這些屬性更便于設計 xaml 内容組合,以便在将該 xaml

内容用于控件示例或更大 ui 頁面的其他部分之後,你能夠預測可能存在的布局限制。

注意  如果要從 microsoft silverlight 遷移

xaml,代表整個 ui

頁面的根元素上可能存在下列特性。在這種情況下,你可能希望删除這些特性。與使用 d:designheight 和 d:designwidth 的固定大小頁面布局相比,xaml

設計器的其他功能(如模拟器)對于設計能夠很好地處理縮放和視圖狀态的頁面布局或許更有用。

d:datacontext 特性:可以針對頁面根或控件設定此特性,以便替代該對象所擁有的任何顯式或繼承的。

d:designsource 特性:為  指定設計時資料源,并替代 。

d:designinstance 和 d:designdata

标記擴充:這些标記擴充用于為 d:datacontext 或 d:designsource 提供設計時資料資源。在這裡,我們不會完全記錄如何使用設計時資料源資源。有關詳細資訊,請參閱。有關一些用法示例,請參閱。

" mc:" 表示并支援讀取 xaml 的标記相容性模式。通常,"d:"

字首與特性 mc:ignorable 相關聯。此技術使運作時 xaml 分析器忽略 "d:"

中的設計特性。

"local:" 是一個字首,通常會在模闆化 windows 應用商店應用項目的 xaml

頁面中為你映射它。它映射為引用相同的命名空間,該命名空間旨在包含  類和所有

xaml 檔案(包括 app.xaml)的代碼。隻要你在此相同命名空間中定義你要在 xaml

中使用的任何自定義類,你就可以使用 local: 字首在 xaml 中引用你的自定義類型。來自模闆化的

windows 應用商店應用項目的相關字首是 common:。此字首引用包含實用程式類(例如轉換器和指令)的嵌套

"common" 命名空間,你可以在“解決方案資料總管”視圖的 common 檔案夾中找到定義。

不要使用。"vsm:" 是有時在從其他 microsoft 技術導入的較老 xaml

模闆中會看到的一個字首。該命名空間最初解決了舊版命名空間工具問題。你應該在用于 windows 運作時的任何 xaml 中删除 "vsm:" 的 xaml

命名空間定義,更改、 和相關對象的任何字首的用法,進而使用預設的

xaml 命名空間。有關 xaml 遷移的詳細資訊,請參閱。

你可以映射一個 xaml 命名空間,這樣可使用 xaml

通路你自己的自定義類型。換句話說,你正在映射一個代碼命名空間,因為它存在于一個定義了自定義類型的代碼表示中,為它配置設定一個 xaml

命名空間以及一個字首供其使用。針對 xaml 的自定義類型可在 microsoft .net 語言(c# 或 microsoft visual basic)或

c++

中定義。映射通過定義一個xmlns 字首來執行。例如,<code>xmlns:mytypes</code> 定義一個新

xaml 命名空間,通過在所有用法中添加令牌 <code>mytypes:</code> 作為字首來通路這個命名空間。

xmlns 定義包含一個值以及字首命名。該值是一個包含在引号内的字元串,後跟一個等号。一種常見的 xml

約定是将 xml 命名空間與一個統一資源辨別符 (uri) 相關聯,這樣就實作了唯一性和辨別約定。你也可以在預設 xaml 命名空間和 xaml 語言 xaml

命名空間中看到此約定,也可以在 windows 運作時 xaml 所使用的且不太常見的 xaml 命名空間中看到此約定。對于映射自定義類型(而不是指定一個

uri)的 xaml 命名空間,你可以為定義添加令牌 "using:" 作為字首。在 "using:" 令牌後,可命名代碼命名空間。

例如,要映射一個允許你引用 "customclasses" 命名空間的 "custom1" 字首,并使用來自該命名空間或程式集的類作為 xaml

中的字首,你的 xaml

頁面應在根元素上包含以下映射: <code>xmlns:custom1="using:customclasses"</code>

不需要映射同一頁面範圍中的分部類。例如,不需要字首即可引用你為處理來自頁面的 xaml ui 定義的事件而定義的任何事件處理程式。另外,visual

studio 生成的使用 c++、c# 或 visual basic 的 windows 運作時應用項目的許多起始 xaml 頁面已映射 "local:"

字首,它引用項目指定的預設命名空間和分部類定義所使用的命名空間。

如果使用 .net 語言(c# 或 microsoft visual basic)編寫支援代碼,你可能會在命名空間名稱中使用一個點 (".")

的約定,以建立代碼命名空間的概念性層次結構。如果命名空間定義包含一個點,則這個點應該是你在 "using:" 令牌之後指定的值的一部分。

如果代碼隐藏檔案或代碼定義檔案是 c++ 檔案,那麼某些約定仍然遵守公共語言運作時 (clr) 語言形式,是以在 xaml 文法上沒有差別。如果在 c++

中聲明嵌套的命名空間,則在指定 "using:" 令牌後的值時,連續的嵌套命名空間字元串之間的分隔符也應是一個 ".",而不是 "::"。

當你定義代碼以供使用 xaml 時,請勿使用嵌套類型(例如在某個類中嵌套枚舉)。無法評估嵌套類型。xaml

分析器無法區分某個點是嵌套類型名稱的一部分,而不是命名空間名稱的一部分。

定義 xaml

命名空間的支援類型的程式集名稱不是在映射中指定的。關于哪些程式集可用的邏輯在應用定義級别控制,包含在基本應用部署和安全原則中。在項目設定中,将你希望作為

xaml 的一個代碼定義源包含的任何程式集聲明為一個獨立程式集。有關詳細資訊,請參閱。

如果從主要應用的應用程式定義或頁面定義中引用自定義類型,這些類型無需進一步的依賴程式集配置即可使用,但你仍然必須映射包含這些類型的代碼命名空間。一種常見的約定是映射任何給定

xaml 頁面的預設代碼命名空間的字首 "local"。此約定常常包含在 xaml 項目的初始項目模闆中。

如果你引用附加屬性,附加屬性名稱的所有者鍵入部分必須在預設 xaml

命名空間中,或者必須帶有字首。很少會獨立于屬性元素向屬性添加字首,但這種情況有時是必需的,特别是對于自定義附加屬性而言。有關詳細資訊,請參閱。