下列範例會 Button 使用 XamlWriter 類別,將轉換成字串。 接著會使用 類別上的 XamlReader 靜態 Load 方法,將字串載入回 Button

// Create the Button. Button originalButton = new Button(); originalButton.Height = 50; originalButton.Width = 100; originalButton.Background = Brushes.AliceBlue; originalButton.Content = "Click Me"; // Save the Button to a string. string savedButton = XamlWriter.Save(originalButton); // Load the button StringReader stringReader = new StringReader(savedButton); XmlReader xmlReader = XmlReader.Create(stringReader); Button readerLoadButton = (Button)XamlReader.Load(xmlReader); ' Create the Button. Dim originalButton As New Button() originalButton.Height = 50 originalButton.Width = 100 originalButton.Background = Brushes.AliceBlue originalButton.Content = "Click Me" ' Save the Button to a string. Dim savedButton As String = XamlWriter.Save(originalButton) ' Load the button Dim stringReader As New StringReader(savedButton) Dim xmlReader As XmlReader = XmlReader.Create(stringReader) Dim readerLoadButton As Button = CType(XamlReader.Load(xmlReader), Button)

同步 Load 方法是靜態的,但異步 LoadAsync 方法不是靜態的,而且需要類別的 XamlReader 實例才能使用。

方法的 Load 輸出是單一物件,代表所建立物件樹狀結構或物件圖形的根物件。 建立的物件 XamlReader 圖形通常會在運行時間新增至 WPF 應用程式的現有物件樹狀結構。 否則,系統會將新的物件圖形視為已中斷連線,以供WPF 應用程式模型使用。 這表示它不會轉譯,而且無法使用套用至 WPF 應用程式主要物件樹狀結構的任何物件 (樹狀結構技術來存取,例如 API FindName LogicalTreeHelper VisualTreeHelper ) 。 如需物件樹狀結構概念的詳細資訊,請參閱 WPF 中的樹狀結構

XamlReader 支援下列主要案例:

  • 複製/對象處理站 :如果沒有其他機制,參考類型通常不能包含在 WPF 物件樹狀結構中的多個位置。 (提供在 WPF 中共用或重複使用之其他機制的範例,包括以 為基礎的 Freezable 物件,或支援從 .) 複製物件樹狀結構中已存在 ResourceDictionary 之物件的一種方式,就是 Brush 使用 XamlWriter.Save 串行化物件。 接著,您會使用串行化字串作為對 的呼叫 Load 輸入,並搭配數據流或 XmlReader 作為媒介。

  • 根據 Just-In-Time 資訊建構物件 :通常還有其他方法可以讓晚期系結或使用者提供的輸入變更現有物件的狀態。 例如,您可以使用相同的值來設定多個屬性,或使用數據系結。 但是,如果您有一個案例,即使要建立的物件類型只能在運行時間或用戶互動時判斷,則建立這類物件的方式是建置輸入的字串 Load 通常是有用的技術。

  • 使用現有的資源技術 :此 Stream 類型經常用於其他架構或技術,以跨應用程式界限或類似情況傳輸數據或物件。 然後 Stream ,您可以使用技術來儲存或取得最終用來建立物件的 XAML 格式數據,作為應用程式的一部分。

  • 已修正的檔: 您的應用程式可能會載入本機或下載的 XPS 檔,以包含在 WPF 應用程式物件樹狀目錄和 UI 中。

    本文件有時會描述物件圖形,而不是物件樹狀結構。 嚴格的父子關聯性不一定存在於運行時間 WPF 應用程式的運行時間對象關聯性中,因此物件圖形是更廣泛的適用術語。 不過,因為 WPF 也包含兩個不同的樹狀結構概念化 API ( LogicalTreeHelper VisualTreeHelper ) 樹狀結構隱喻仍然適用於 WPF 中大部分的實際案例。 不過,從 XAML 語言的觀點來看,物件圖形通常是考慮如何從 XAML 建立物件的最佳方式,因為 XAML 語言本身不一定指定協助程序類別方法,讓關聯性更進一步進入樹狀結構。

    程序代碼存取安全性、鬆散 XAML 和 XamlReader

    XAML 是直接表示物件執行個體化和執行的標記語言。 因此,XAML 中建立的元素在與系統資源互動方面 (例如網路存取、檔案系統 IO),跟對等的產生程式碼具有一樣的能力。

    WPF 支援 .NET 安全性架構代碼存取安全性 (CAS) 。 這表示在因特網區域中執行的 WPF 內容已降低執行許可權。 (XAML 查看器) 和 XAML 瀏覽器應用程式 (XBAP) 在載入時解譯的非編譯 XAML 頁面,通常會在此因特網區域中執行,並使用相同的許可權集合。 然而,完全信任應用程式中載入的 XAML,具有與裝載應用程式相同的系統資源存取權限。 如需詳細資訊,請參閱 WPF 部分信任安全性

    這些語句 XamlReader 的含意在於您的應用程式設計必須針對您決定載入的 XAML 做出信任決策。 如果您要載入不受信任的 XAML,請考慮實作您自己的沙盒化技術,以瞭解如何載入產生的物件圖形。

    XamlReader 也可以由部分信任程式代碼呼叫。 在此情況下,因特網安全性區域會套用至代碼存取安全性。 如果載入的 XAML 中的任何專案在因特網安全性區域中無效,則會擲回 XAML 剖析例外狀況。 在平台層級部分信任的 XBAP 和其他屬於部分信任的情況下, XamlReader 您會取得與明確部分信任呼叫相同的例外狀況行為。

    WPF XAML、XAML 讀取器/寫入器及 XAML 語言版本設定

    XAML2009包含語言功能,例如 x:Reference x:FactoryMethod 。 您可以使用 或 Parse 的簽章來載入使用這些功能的 Load XAML。 不過,XAML 不支援這些語言功能,這些語言功能需要標記編譯 (,例如 WPF 應用程式中 頁面 建置動作的 XAML,或任何涉及建置動作中標記編譯工作的 XAML,) 。

    WPF 類型和 WPF 技術一般支援依賴 WPF 內部存取的概念。 例如,WPF 如何實作相依性屬性,依賴內部技術來進行有效率的類型成員查閱。 XAML 讀取和寫入 API 可從命名空間和 PresentationFramework 元件中 XamlWriter XamlReader System.Windows.Markup 提供存取這些內部專案。 不過,從 System.Xaml 元件 (類別 System.Xaml.XamlReader System.Xaml.XamlWriter 的較低層級 XAML 讀取器和 XAML 寫入器,) 無法存取 WPF 內部。 沒有任何從 System.Xaml 到任何 WPF 特定元件的相依性。 若沒有 WPF 內部的存取權,System.Xaml 讀取器和寫入器就無法正確載入或儲存所有 WPF 類型,或根據 WPF 類型的類型。 特別是,System.Xaml 讀取器和寫入器不瞭解 WPF 相依性屬性備份屬性存放區等概念,或 WPF 如何使用樣式、資源字典和範本的所有細節。 因此,您可以選擇:

  • 如果您要以任何方式載入 WPF 類型和/或是在 BAML 窗體中使用 XAML,請使用 PresentationFramework XAML 讀取器和 XAML 寫入器。

  • 如果您不依賴任何 WPF 類型或 XAML 的 BAML 形式,而且基於該架構特有的原因,請勿使用另一種特定技術的 XAML 讀取器或 XAML 寫入器實作,請使用 System.Xaml XAML 讀取器和 XAML 寫入器。

    .NET 4 中的 System.Xaml 備份實作

    XamlReader 是 WPF 架構層級 XAML 剖析器的可呼叫 API 介面。 相同的基礎 XAML 剖析器也會針對以 .NET Framework 3.0 和 .NET Framework 3.5 為目標的 WPF 應用程式執行運行時間 XAML 載入和剖析。

    如果您以 .NET Framework 4 為目標,外部 API 是相同的,但實作的一部分是以 System.Xaml 元件中的 .NET Framework 4 一般 XAML 實作為基礎所建置,可改善剖析 XAML 的許多技術和報告層面。 以 .NET Framework 4 為目標時,一定需要包括 System.Xaml 作為參考,以及實作的詳細數據,例如報告的例外狀況可能來自 System.Xaml 定義型別。

    即將推出:在 2024 年,我們將隨著內容的意見反應機制逐步淘汰 GitHub 問題,並以新的意見反應系統來取代。 如需詳細資訊,請參閱 https://aka.ms/ContentUserFeedback

    提交並檢視相關的意見反應

  •