XamlReader 类

定义

使用 WPF 默认 XAML 读取器和关联的 XAML 对象编写器读取 XAML 输入并创建对象图。

public ref class XamlReader
public class XamlReader
type XamlReader = class
Public Class XamlReader
继承
XamlReader

示例

以下示例使用 XamlWriter 类将 转换为Button字符串。 然后,在 类上使用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 应用程序的main对象树 ((例如 API FindNameLogicalTreeHelperVisualTreeHelper) )的任何对象树技术进行访问。 有关对象树概念的详细信息,请参阅 WPF 中的树

XamlReader 支持以下主要方案:

  • 克隆/对象工厂:如果没有其他机制,引用类型通常不能包含在 WPF 对象树中的多个位置中。 (支持在 WPF 中共享或重用的其他机制的示例包括基于 Freezable的对象,或对通常可共享的对象(例如 BrushResourceDictionary.) 作为项引用的对象)的支持的一种方法是使用 XamlWriter.Save序列化对象。 然后,使用序列化的字符串作为对 的调用 Load的输入,并作为流或 XmlReader 中介。

  • 基于实时信息构造对象:通常还有其他方法可让后期绑定或用户提供的输入更改现有对象的状态。 例如,可以使用同一值来设置多个属性,或使用数据绑定。 但是,如果你的情况是,即使要创建的对象类型只能在运行时或用户交互时确定,则通过构建输入字符串 Load 来创建此类对象通常是一种有用的方法。

  • 使用现有资源技术:该 Stream 类型经常用于其他框架或技术,用于跨应用程序边界传输数据或对象,或者用于类似情况。 然后,可以使用这些 Stream 技术来存储或获取 XAML 格式的数据,这些数据最终用于将对象创建为应用程序的一部分。

  • 固定文档: 应用程序可能会加载本地或下载的 XPS 文档,以包含在 WPF 应用程序对象树和 UI 中。

注意

本文档有时介绍对象图,而不是对象树。 在运行时 WPF 应用程序的运行时对象关系中并不总是存在严格的父子关系,因此对象图是一种更广泛的适用术语。 但是,由于 WPF 还包括两个不同的树概念化 API (LogicalTreeHelperVisualTreeHelper) 树隐喻仍然充分适用于 WPF 中的大多数实际案例。 但是,从 XAML 语言的角度来看,对象图通常是考虑如何使用 XAML 创建对象的最佳方式,因为 XAML 语言本身不一定指定帮助程序类方法,从而再次将关系引入树结构。

代码访问安全性、松散 XAML 和 XamlReader

XAML 是一种直接表示对象实例化和执行的标记语言。 因此,在 XAML 中创建的元素能够像等效的生成代码那样与系统资源(如网络访问、文件系统 IO)进行交互。

WPF 支持 .NET 安全框架代码访问安全性 (CAS) 。 这意味着在 Internet 区域中运行的 WPF 内容具有缩减的执行权限。 “松散 XAML” (在加载时由 XAML 查看器) 和 XAML 浏览器应用程序 (XBAP) 解释的非编译 XAML 页面,通常在此 Internet 区域中运行并使用相同的权限集。 但是,加载到完全受信任的应用程序中的 XAML 与承载应用程序具有相同的系统资源访问权限。 有关详细信息,请参阅 WPF 部分信任安全性

这些语句 XamlReader 的含义是,应用程序设计必须对决定加载的 XAML 做出信任决策。 如果要加载不受信任的 XAML,请考虑实现你自己的沙盒技术,以了解如何加载生成的对象图。

XamlReader 也可以由部分信任代码调用。 在这种情况下,将应用 Internet 安全区域来保障代码访问安全性。 如果在 Internet 安全区域下加载的 XAML 中的任何内容无效,则会引发 XAML 分析异常。 在 XBAP 和其他在平台级别属于部分信任的情况(其中 XamlReader 是执行一部分)下,你将获得与显式部分信任调用相同的异常行为。

WPF XAML、XAML 读取器/编写器和 XAML 语言版本控制

XAML2009包括 语言功能,例如 x:Referencex:FactoryMethod。 可以使用 或 ParseLoad签名来加载使用这些功能的 XAML。 但是,需要标记编译 (XAML(例如 WPF 应用程序中 页面 生成操作的 XAML)或生成操作) 中涉及标记编译任务的任何 XAML 不支持这些语言功能。

WPF 类型和 WPF 技术通常支持依赖于对 WPF 内部的访问的概念。 例如,WPF 如何实现依赖属性依赖于内部技术来实现高效的类型成员查找。 通过命名空间和 PresentationFramework 程序集中 XamlWriterXamlReaderSystem.Windows.Markup 提供的 XAML 读取和写入 API 启用对这些内部对象的访问。 但是,System.Xaml 程序集中的较低级别的 XAML 读取器和 XAML 编写器 (基于 System.Xaml.XamlReader的类, System.Xaml.XamlWriter) 无权访问 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 定义的类型)。

构造函数

XamlReader()

初始化 XamlReader 类的新实例。

方法

CancelAsync()

如果有挂起的异步加载操作,则中止当前的异步加载操作。

Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
GetHashCode()

作为默认哈希函数。

(继承自 Object)
GetType()

获取当前实例的 Type

(继承自 Object)
GetWpfSchemaContext()

返回一个 XamlSchemaContext 对象,该对象表示 XamlReader 的 WPF 架构上下文设置。

Load(Stream)

读取指定 Stream 中的 XAML 输入,并返回作为相应对象树根的 Object

Load(Stream, Boolean)

使用 WPF 默认 XAML 读取器和关联的 XAML 对象编写器读取 XAML 输入并创建对象图。

Load(Stream, ParserContext)

读取指定 Stream 中的 XAML 输入,并返回作为相应对象树根的对象。

Load(Stream, ParserContext, Boolean)

使用 WPF 默认 XAML 读取器和关联的 XAML 对象编写器读取 XAML 输入并创建对象图。

Load(XamlReader)

通过所提供的 XamlReader 读取 XAML 输入,并返回作为相应对象树根的对象。

Load(XmlReader)

读取指定 XmlReader 中的 XAML 输入,并返回作为相应对象树根的对象。

Load(XmlReader, Boolean)

使用 WPF 默认 XAML 读取器和关联的 XAML 对象编写器读取 XAML 输入并创建对象图。

LoadAsync(Stream)

读取指定 Stream 中的 XAML 输入,并返回相应对象树的根。

LoadAsync(Stream, Boolean)

使用 WPF 默认 XAML 读取器和关联的 XAML 对象编写器读取 XAML 输入并创建对象图。

LoadAsync(Stream, ParserContext)

读取指定 Stream 中的 XAML 输入,并返回相应对象树的根。

LoadAsync(Stream, ParserContext, Boolean)

使用 WPF 默认 XAML 读取器和关联的 XAML 对象编写器读取 XAML 输入并创建对象图。

LoadAsync(XmlReader)

读取指定 XmlReader 中的 XAML 输入,并返回相应对象树的根。

LoadAsync(XmlReader, Boolean)

使用 WPF 默认 XAML 读取器和关联的 XAML 对象编写器读取 XAML 输入并创建对象图。

MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
Parse(String)

读取指定文本字符串中的 XAML 输入,并返回与指定标记的根对应的对象。

Parse(String, Boolean)

使用 WPF 默认 XAML 读取器和关联的 XAML 对象编写器读取 XAML 输入并创建对象图。

Parse(String, ParserContext)

(使用指定的 ParserContext)读取指定文本字符串中的 XAML 标记,并返回与指定标记的根对应的对象。

Parse(String, ParserContext, Boolean)

使用 WPF 默认 XAML 读取器和关联的 XAML 对象编写器读取 XAML 输入并创建对象图。

ToString()

返回表示当前对象的字符串。

(继承自 Object)

事件

LoadCompleted

在异步加载操作完成时发生。

适用于

另请参阅