XAMLServices 类和基本的 XAML 读取或写入

XamlServices 是由 .NET 提供的类,可用于解决不需要对 XAML 节点流的特定访问权限或从这些节点获取的 XAML 类型系统信息的 XAML 方案。 XamlServices API 可以按如下所示进行汇总:LoadParse 支持 XAML 加载路径,Save 支持 XAML 保存路径,Transform 提供联接加载路径和保存路径的技术。 Transform 可用于从一个 XAML 架构更改为另一个 XAML 架构。 本主题总结了上述每个 API 分类,并介绍了特定方法重载之间的差异。

负荷

Load 的各种重载实现负载路径的完整逻辑。 加载路径以某种形式使用 XAML 并输出 XAML 节点流。 其中大多数加载路径在编码的 XML 文本文件窗体中使用 XAML。 但是,也可以加载常规流,也可以加载已包含在其他 XamlReader 实现中的预加载 XAML 源。

大多数方案的最简单的重载是 Load(String)。 此重载具有一个 fileName 参数,该参数只是包含要加载的 XAML 的文本文件的名称。 这适用于应用程序方案,例如以前序列化状态或数据到本地计算机的完整信任应用程序。 这对于定义应用程序模型并想要加载定义应用程序行为、启动 UI 或其他框架定义功能(使用 XAML)的标准文件之一的框架也很有用。

Load(Stream) 也有类似的方案。 如果用户选择要加载的文件,则此重载可能很有用,因为 Stream 是可访问文件系统的其他 System.IO API 的频繁输出。 或者,可以通过异步下载或其他提供流的网络技术来访问 XAML 源。 (从流或用户选择的源加载可能会产生安全影响。有关详细信息,请参阅 XAML 安全注意事项。)

Load(TextReader)Load(XmlReader) 是依赖于以前版本的 .NET 格式的读取器重载。 若要使用这些重载,应已创建读取器实例,并使用其 Create API 以相关形式(文本或 XML)加载 XAML。 如果已在其他读取器中移动记录指针或对其执行其他操作,则这并不重要。 来自 Load 的加载路径逻辑始终从根目录下处理整个 XAML 输入。 以下方案可能保证使用这些重载:

  • 设计图面,可在其中从现有的特定于 XML 的文本编辑器提供简单的 XAML 编辑功能。

  • 核心 System.IO 方案的变体,其中使用专用读取器打开文件或流。 逻辑在尝试以 XAML 形式加载之前对内容执行基本的检查或处理。

可以加载文件或流,也可以加载 XmlReaderTextReaderXamlReader,通过加载读取器的 API 来包装 XAML 输入。

在内部,上述每个重载最终都会 Load(XmlReader),传递的 XmlReader 用于创建新的 XamlXmlReader

为更高级的方案提供 Load 签名 Load(XamlReader)。 可以将此签名用于以下情况之一:

  • 你已定义自己的 XamlReader实现。

  • 需要为与默认设置不同的 XamlReader 指定设置。

非默认设置的示例:

AllowProtectedMembersOnRoot
BaseUri
IgnoreUidsOnPropertyElements
LocalAssembly
ValuesMustBeString

XamlServices 的默认读取器为 XamlXmlReader。 如果提供自己的 XamlXmlReader 设置,以下是设置非默认 XamlXmlReaderSettings的属性:

CloseInput
SkipXmlCompatibilityProcessing
XmlLang
XmlSpacePreserve

解析

Parse 就像 Load,因为它是从 XAML 输入创建 XAML 节点流的加载路径 API。 但是,在这种情况下,XAML 输入直接作为包含要加载的所有 XAML 的字符串提供。 Parse 是一种轻型方法,比框架方案更适合应用程序方案。 有关详细信息,请参阅 ParseParse 只是内部涉及 StringReader 的包装 Load(XmlReader) 调用。

Save 的各种重载实现保存路径。 所有 Save 方法都采用对象图作为输入并生成输出作为流、文件或 XmlWriter/TextWriter 实例。

输入对象应为某些对象表示形式的根对象。 这可能是业务对象的单个根、UI 方案中页面的对象树的根、设计工具中的工作编辑图面或适合方案的其他根对象概念。

在许多情况下,保存的对象树与使用 Load 加载 XAML 的原始操作或框架/应用程序模型实现的其他 API 相关。 由于状态更改、应用程序从用户捕获运行时设置的更改、由于应用程序是 XAML 设计图面等,因此对象树中捕获的差异可能有所不同。使用或不更改时,首先从标记加载 XAML,然后再次保存并比较这两个 XAML 标记表单的概念有时称为 XAML 的往返表示形式。

保存和序列化在标记表单中设置的复杂对象的挑战是在完全表示形式之间实现平衡,而不会丢失信息,而不是使 XAML 更易于阅读的详细程度。 此外,XAML 的不同客户可能有不同的定义或期望如何设置平衡。 Save API 表示该平衡的一个定义。 Save API 使用可用的 XAML 架构上下文和基于 CLR 的默认特征 XamlTypeXamlMember和其他 XAML 内部函数和 XAML 类型系统概念来确定在将某些 XAML 节点流构造保存回标记时可以优化哪些 XAML 节点流构造。 例如,XamlServices 保存路径可以使用基于 CLR 的默认 XAML 架构上下文解析对象的 XamlType,可以确定 XamlType.ContentProperty,然后在将属性写入对象的 XAML 内容时省略属性元素标记。

变换

Transform 通过将加载路径和保存路径链接为单个操作来转换或转换 XAML。 不同的架构上下文或不同的后盾类型系统可用于 XamlReaderXamlWriter,这会影响生成的 XAML 的转换方式。 这适用于广泛的转换操作。

对于依赖于检查 XAML 节点流中每个节点的操作,通常不使用 Transform。 相反,需要定义自己的加载路径保存路径操作系列并插话自己的逻辑。 在其中一个路径中,围绕自己的节点循环使用 XAML 读取器/XAML 编写器对。 例如,使用 XamlXmlReader 加载初始 XAML,并使用连续 Read 调用进入节点。 在 XAML 节点流级别操作,现在可以调整单个节点(类型、成员、其他节点)以应用转换,或使节点 as-is。 然后,将节点发送到 XamlObjectWriter 的相关 Write API 并写出对象。 有关详细信息,请参阅 了解 XAML 节点流结构和概念

另请参阅