XAML 服务
本主题介绍称为 .NET XAML 服务的技术集的功能。 描述的大多数服务和 API 位于程序集 System.Xaml
中。 服务包括读取器和编写器、架构类和架构支持、工厂、类的归属、XAML 语言内部支持和其他 XAML 语言功能。
.NET XAML 服务的概念文档假定你以前有过 XAML 语言的经验,以及它如何应用于特定框架,例如 Windows Presentation Foundation(WPF)或 Windows Workflow Foundation,或者特定的技术功能区域,例如 Microsoft.Build.Framework.XamlTypes中的生成自定义功能。 本文档不会尝试将 XAML 的基础知识解释为标记语言、XAML 语法术语或其他介绍性材料。 相反,本文档重点介绍如何使用 System.Xaml 程序集库中启用的 .NET XAML 服务。 其中大多数 API 适用于 XAML 语言集成和扩展性方案。 这可能包括以下任一方案:
扩展基本 XAML 读取器或 XAML 编写器的功能(直接处理 XAML 节点流;派生自己的 XAML 读取器或 XAML 编写器)。
定义不具有特定框架依赖项的 XAML 可用自定义类型,并将类型用于将 XAML 类型系统特征传达给 .NET XAML 服务。
将 XAML 读取器或 XAML 编写器托管为应用程序的组件,例如用于 XAML 标记源的可视化设计器或交互式编辑器。
编写 XAML 值转换器(标记扩展;自定义类型的类型转换器)。
定义自定义 XAML 架构上下文(使用备用程序集加载技术支持类型源;使用已知类型查找技术而不是始终反映程序集;使用不使用公共语言运行时(CLR)的已加载程序集概念
AppDomain
及其关联的安全模型)。扩展基本 XAML 类型系统。
使用
Lookup
或Invoker
技术影响 XAML 类型系统以及如何评估类型支持。
如果要以语言形式查找有关 XAML 的介绍性材料,可以尝试 XAML 概述(WPF .NET)。 本主题讨论面向面向 Windows Presentation Foundation(WPF)以及使用 XAML 标记和 XAML 语言功能的受众的 XAML。 另一个有用的文档是 XAML 语言规范中的介绍性材料。
.NET XAML 服务和 System.Xaml
程序集定义支持 XAML 语言功能所需的大部分内容。 这包括 XAML 读取器和 XAML 编写器的基类。 添加到任何特定于框架的 XAML 实现中不存在的 .NET XAML 服务最重要的功能是 XAML 的类型系统表示形式。 类型系统表示形式以面向对象的方式呈现 XAML,以 XAML 功能为中心,而无需依赖框架的特定功能。
XAML 类型系统不受 XAML 源的标记形式或运行时细节的限制;也不受任何特定后盾类型系统的限制。 XAML 类型系统包括类型、成员、XAML 架构上下文、XML 级概念和其他 XAML 语言概念或 XAML 内部函数的对象表示形式。 使用或扩展 XAML 类型系统可以派生自 XAML 读取器和 XAML 编写器等类,并将 XAML 表示形式的功能扩展到框架、技术或使用或发出 XAML 的应用程序启用的特定功能。 XAML 架构上下文的概念允许通过 XAML 对象编写器实现、上下文中的程序集信息以及 XAML 节点源中通过程序集信息进行通信的技术后盾类型系统,实现实际对象图写入操作。 有关 XAML 架构概念的详细信息。 请参阅 默认 XAML 架构上下文和 WPF XAML 架构上下文。
若要了解 .NET XAML 服务在 XAML 语言与将 XAML 用作语言的特定技术之间的关系中扮演的角色,了解 XAML 节点流的概念以及该概念如何塑造 API 和术语很有帮助。 XAML 节点流是 XAML 语言表示形式与 XAML 表示或定义的对象图之间的概念中间。
XAML 读取器是一个实体,它以某种形式处理 XAML,并生成 XAML 节点流。 在 API 中,XAML 读取器由基类 XamlReader表示。
XAML 编写器是一个实体,它处理 XAML 节点流并生成其他内容。 在 API 中,XAML 编写器由基类 XamlWriter表示。
涉及 XAML 的两种最常见方案是加载 XAML 来实例化对象图,并从应用程序或工具保存对象图并生成 XAML 表示形式(通常以保存为文本文件的标记形式)。 本文档通常将加载 XAML 和创建对象图称为加载路径。 本文档通常将现有对象图保存到 XAML 或将其序列化为保存路径。
最常见的负载路径类型如下:
从 XAML 表示形式开始,采用 UTF 编码的 XML 格式,并另存为文本文件。
将该 XAML 加载到 XamlXmlReader中。 XamlXmlReader 是 XamlReader 子类。
结果是 XAML 节点流。 可以使用 XamlXmlReader / XamlReader API 访问 XAML 节点流的单个节点。 此处最典型的操作是推进 XAML 节点流,使用“当前记录”隐喻处理每个节点。
将生成的节点从 XAML 节点流传递到 XamlObjectWriter API。 XamlObjectWriter 是 XamlWriter 子类。
XamlObjectWriter 根据源 XAML 节点流中的进度,一次写入一个对象图,一个对象。 对象写入是在 XAML 架构上下文和可访问支持类型系统和框架的程序集和类型的实现的帮助下完成的。
在 XAML 节点流末尾调用 Result 以获取对象图的根对象。
最常见的保存路径类型如下:
从整个应用程序运行时的对象图、运行时的 UI 内容和状态或整个应用程序对象表示形式的较小段开始。
从逻辑开始对象(如应用程序根目录或文档根)将对象加载到 XamlObjectReader。 XamlObjectReader 是 XamlReader 子类。
结果是 XAML 节点流。 可以使用 XamlObjectReader 和 XamlReader API 访问 XAML 节点流的单个节点。 此处最典型的操作是推进 XAML 节点流,使用“当前记录”隐喻处理每个节点。
将生成的节点从 XAML 节点流传递到 XamlXmlWriter API。 XamlXmlWriter 是 XamlWriter 子类。
XamlXmlWriter 在 XML UTF 编码中写入 XAML。 可以将该文件另存为文本文件、流或其他形式的文件。
调用 Flush 以获取最终输出。
有关 XAML 节点流概念的详细信息,请参阅 了解 XAML 节点流结构和概念。
并不总是需要处理 XAML 节点流。 如果需要基本加载路径或基本保存路径,可以在 XamlServices 类中使用 API。
Load 的各种签名实现加载路径。 可以加载文件或流,也可以加载 XmlReader、TextReader 或 XamlReader,通过加载该读取器的 API 包装 XAML 输入。
Save 的各种签名保存对象图并生成输出作为流、文件或 XmlWriter/TextWriter 实例。
Transform 通过将加载路径和保存路径链接为单个操作来转换 XAML。 不同的架构上下文或不同的后盾类型系统可用于 XamlReader 和 XamlWriter,这会影响生成的 XAML 的转换方式。
有关如何使用 XamlServices的详细信息,请参阅 XAMLServices 类和基本 XAML 读取或写入。
XAML 类型系统提供使用 XAML 节点流的给定单个节点所需的 API。
XamlType 是对象的表示形式 - 在开始对象节点和结束对象节点之间正在处理的内容。
XamlMember 是对象成员的表示形式 - 在开始成员节点和结束成员节点之间正在处理的内容。
GetAllMembers、GetMember 和 DeclaringType 等 API 报告 XamlType 与 XamlMember之间的关系。
.NET XAML 服务实现的 XAML 类型系统的默认行为基于公共语言运行时(CLR),并使用反射对程序集中的 CLR 类型进行静态分析。 因此,对于特定的 CLR 类型,XAML 类型系统的默认实现可以公开该类型的 XAML 架构及其成员,并在 XAML 类型系统中报告它。 在默认 XAML 类型系统中,类型的可分配性概念映射到 CLR 继承,实例、值类型等的概念也映射到 CLR 的支持行为和功能。
为了支持 XAML,.NET XAML 服务提供为 XAML 语言 XAML 命名空间定义的 XAML 语言概念的特定实现。 这些内容记录为特定的参考页。 语言功能从 XAML 读取器或 .NET XAML 服务定义的 XAML 编写器处理这些语言特征的行为方式的角度来记录。 有关详细信息,请参阅 XAML 命名空间 (x:) 语言功能。