共用方式為


預設 XAML 架構內容和 WPF XAML 架構內容

XAML 架構內容是一個概念實體,可限定使用特定 XAML 詞彙的 XAML 生產環境如何與物件寫入行為互動,包括類型對應如何解析、如何載入元件、如何解譯特定讀取器和寫入器設定。 本主題描述 .NET XAML 服務的功能,以及以 CLR 類型系統為基礎的相關聯預設 XAML 架構內容。 本主題也會描述用於 WPF 的 XAML 架構內容。

預設 XAML 架構內容

.NET XAML 服務會實作並使用預設的 XAML 架構內容。 預設的 XAML 架構內容行為不一定在 XamlSchemaContext 類別的 API 中完全可見。 不過,在許多情況下,預設 XAML 架構內容影響的行為可透過 XAML 類型系統的常見 API 來觀察,例如 XamlMemberXamlType的成員,或透過使用預設 XAML 架構內容之 XAML 讀取器和 XAML 寫入器上公開的 API。

您可以藉由呼叫 XamlSchemaContext 建構函式來建立封裝預設行為的 XamlSchemaContext。 這會明確建立預設的 XAML 架構內容。 如果您使用未明確採用 XamlSchemaContext 輸入參數的 API 來初始化 XAML 讀取器或 XAML 寫入器,則會隱含建立相同的預設 XAML 架構內容。

默認 XAML 架構內容依賴 CLR 反映其類型對應行為。 這包括檢查定義 CLR Type,以及相關的 PropertyInfoMethodInfo。 此外,會使用類型或成員的CLR屬性,以填入使用CLR支援類型的XAML類型或 XAML 成員資訊的特定資訊。 默認 XAML 架構內容不需要類型系統擴充技術,例如 Invoker 模式,因為 CLR 類型系統可以使用必要的資訊。

針對元件載入邏輯,預設 XAML 架構內容主要依賴 XAML 命名空間對應中提供的任何元件值。 此外,針對載入內部類型等案例,LocalAssembly 可以提示要載入的元件。

WPF XAML 架構內容

本主題將說明 WPF XAML 架構內容,因為 WPF 實作提供了一個有趣的說明,說明實作非預設 XAML 架構內容所導入的功能種類。 此外,在處理 WPF XAML 的 WPF 檔中,不會討論 XAML 架構內容概念;XAML 架構內容啟用的行為只有在與討論預設 XAML 架構內容的運作方式整合時,才能完全理解。 WPF XAML 架構內容會實作下列行為。

查閱覆寫: WPF 有一些 XAML 內容模型,其中有 XAML 內容屬性可運作,而不需要 ContentPropertyAttribute 屬性。 LookupContentProperty WPF 的覆寫會實作此行為。

WPF 表達式的延遲: WPF 具有數個運算式類別,這些運算式類別會延遲值,直到運行時間內容可用為止。 此外,範本擴充是依賴延遲技術的運行時間行為。

類型系統查閱優化: WPF 具有廣泛的 XAML 詞彙和物件模型,包括繼承至數百個 WPF 定義類別的基類成員定義。 此外,WPF 本身也會分散到數個元件。 WPF 會使用查閱表格和其他技術來優化其類型查閱。 這會提供預設 XAML 架構內容及其 CLR 型別查閱的效能改善。 在查閱表格中不存在類型的情況下,行為會使用類似於預設 XAML 架構內容的 XAML 架構內容技術。

XamlType 和 XamlMember 擴充: WPF 會使用相依性屬性擴充屬性概念,以及具有路由事件的事件概念。 為了提高 XAML 處理作業的可見度,WPF 會擴充 XamlTypeXamlMember,並新增報告相依性屬性和路由事件特性的內部屬性。

存取 WPF XAML 架構內容

如果您使用以 WPF System.Windows.Markup.XamlReaderSystem.Windows.Markup.XamlWriter為基礎的 XAML 技術,則 WPF XAML 架構內容已在這些 XAML 讀取器和 XAML 寫入器實作上使用。

如果您使用其他未使用 WPF XAML 架構內容初始化的 XAML 讀取器或 XAML 寫入器實作,您或許可以從 XamlReader.GetWpfSchemaContext取得運作中的 WPF XAML 架構內容。 然後,您可以使用此值作為使用 XamlSchemaContext的其他 API 初始化。 例如,您可以呼叫 XamlXmlReader 進行初始化,並傳遞 WPF XAML 架構內容。 或者,您可以針對 XAML 類型系統作業使用 WPF XAML 架構內容。 這可能包括建構初始化 XamlTypeXamlMember,或呼叫 XamlSchemaContext.GetXamlType

請注意,如果您從純 XAML 節點數據流檢視方塊存取 WPF XAML 的某些層面,某些 WPF 架構功能可能尚未採取行動。 例如,尚未套用控件的 WPF 範本。 因此,如果您存取在運行時間可能會填入完整可視化樹狀結構的屬性,您可能只會看到參考範本的屬性值。 如果從非運行時間的情況提供提供給 WPF 標記延伸的服務內容可能也不精確,而且在嘗試寫入物件圖形時可能會導致例外狀況。

XAML 和元件載入

XAML 和 .NET XAML 服務的元件載入會與 CLR 定義的 AppDomain概念整合。 XAML 架構內容會根據 AppDomain 和其他因素,解譯如何在運行時間或設計時間載入元件或尋找類型。 邏輯會根據 XAML 讀取器的 XAML 是鬆散的 XAML、由 XamlBuildTask編譯成 DLL,還是 WPF PresentationBuildTask所產生的 BAML,而邏輯會稍有不同。

WPF 的 XAML 架構內容會與 WPF 應用程式模型整合,進而使用 AppDomain,以及 WPF 實作詳細數據的其他因素。

XAML 讀取器輸入 (鬆散 XAML)

  1. XAML 架構內容會逐一查看應用程式的 AppDomain,尋找符合名稱所有層面的已載入元件,從最近載入的元件開始。 如果找到相符專案,該元件會用於解析。

  2. 否則,根據CLR Assembly API的下列其中一種技術可用來載入元件:

XamlBuildTask

XamlBuildTask 用於 Windows Communication Foundation (WCF) 和 Windows Workflow Foundation。

請注意,透過 XamlBuildTask 的元件參考一律為完整。

  1. 在限定名稱上呼叫 Assembly.Load(String)

  2. 如果上一個步驟失敗,請使用簡短名稱(如果有的話,請使用公鑰令牌)來呼叫 Assembly.Load(String)

BAML (PresentationBuildTask)

BAML 的元件載入有兩個層面:載入包含BAML做為元件的初始元件,以及載入BAML生產環境所參考之任何類型的類型支援元件。

初始標記的元件載入:

從載入標記的元件參考一律不限定。

  1. 從最近載入的元件開始,WPF XAML 架構內容會逐一查看 WPF 應用程式的 AppDomain,尋找符合名稱所有層面的已載入元件。 如果找到相符專案,該元件會用於解析。

  2. 如果上一個步驟失敗,請使用簡短名稱(如果有的話,請使用公鑰令牌)來呼叫 Assembly.Load(String)

BAML 型態的元件參考:

BAML 生產環境中所用類型的元件參考一律為建置工作的輸出完整。

  1. 從最近載入的元件開始,WPF XAML 架構內容會逐一查看 WPF 應用程式的 AppDomain,尋找符合名稱所有層面的已載入元件。 如果找到相符專案,該元件會用於解析。

  2. 否則,會使用下列其中一種技術來載入元件:

    • 在限定名稱上呼叫 Assembly.Load(String)

    • 如果簡短名稱 + 公鑰令牌組合符合從中載入 BAML 的元件,請使用該元件。

    • 使用簡短名稱 + 公鑰令牌來呼叫 Assembly.Load(String)

另請參閱