XAML 的类型转换器和标记扩展

类型转换器和标记扩展是 XAML 类型系统和 XAML 编写器用来生成对象图组件的两种方法。 尽管它们共有一些特征,但在 XAML 节点流中类型转换器和标记扩展以不同的方式表示。 在本文档集中,类型转换器、标记扩展以及类似的构造有时统称为值转换器。

本主题包括下列各节。

  • 值转换器
  • 类型转换器
  • 标记扩展
  • 值序列化程序
  • 其他值转换器
  • 类型转换器和标记扩展组合
  • 值转换器的服务上下文
  • 相关主题

值转换器

在 XAML 中,值转换器用于各种方案。 下面的列表显示 XAML 中不同类型的值转换器:

  • 类型转换器

  • 标记扩展

  • 值序列化程序

  • 为 XAML 文本语法提供逻辑的相关类或支持类

类型转换器

在 .NET Framework XAML 服务定义中,类型转换器是从 CLR TypeConverter 类派生的类。 TypeConverter 是一个在 XAML 存在之前就已经存在于 Microsoft .NET Framework 中的类。 它最初用于支持属性窗口和 IDE 中属性的类似基于文本的编辑形式。 .NET Framework 中 XAML 的引入使用 TypeConverter 将文本语法(位于特性值或 XAML 值节点中)转换为对象。TypeConverter 还可以用于将对象值序列化为文本语法。 在 Windows Presentation Foundation (WPF) 和 Windows Communication Foundation (WCF) 中,TypeConverter 还用于以前特定于框架的 XAML 实现中。有关 XAML 中的 TypeConverter 的更多信息,请参见 XAML 的类型转换器概述

标记扩展

在 .NET Framework XAML 服务实现中,标记扩展是从 MarkupExtension 类派生的类。 标记扩展是一个最初由 XAML 语言生成的概念形式。 可以将标记扩展视为类似于一个调用到服务类中以提供其逻辑的可扩展转义序列。 就标记而言,XAML 处理器通常通过在文本字符串中以左大括号 ({) 开头的文本序列来识别标记扩展。

标记扩展与类型转换器有所不同。 类型转换器通常与类型或成员关联。 当对象图的创建或序列化遇到与这些实体关联的文本语法就会调用类型转换器。

标记扩展与单个支持服务类关联,但可以应用于任何成员值。 (但是,您可以通过使用服务上下文实现标记扩展以将其特意限制为仅供某些成员或目标类型使用。)标记扩展可以重写类型转换器关联。 也可以用于为本来不支持文本语法的成员指定特性值。

有关 XAML 的标记扩展实现模式的更多信息,请参见 XAML 的标记扩展概述

注意注意

MarkupExtensionValueSerializer 类型都位于 System.Windows.Markup 命名空间中,而不在 System.Xaml 命名空间中。但这并不表示这些类型特定于 WPF 或本来会填充包含字符串 Windows 的 CLR 命名空间的 Windows Forms 方法。MarkupExtensionValueSerializer 位于 System.Xaml 程序集中,并且没有特定框架依赖性。这些类型存在于 .NET Framework 3.0 的该 CLR 命名空间中,在 .NET Framework 4 中它们仍然位于该 CLR 命名空间中,以避免破坏现有 WPF 项目中的引用。有关更多信息,请参见从 WPF 迁移到 System.Xaml 的类型

值序列化程序

ValueSerializer 是一个专用类型转换器,该转换器针对将对象转换为字符串进行了优化。 XAML 的 ValueSerializer 可能根本无法实现 ConvertFrom 方法。 ValueSerializer 实现获取服务的方式与 TypeConverter 实现类似。 虚方法提供一个输入 context 参数。 context 参数的类型为 IValueSerializerContext,该参数从 IServiceProvider 接口继承并且具有一个 GetService 方法。

在 XAML 类型系统中,对于将 XAML 节点循环处理用于序列化的 XAML 编写器实现,与类型或成员关联的值转换器由它自己的 XamlType.ValueSerializer 属性报告。 执行序列化的 XAML 编写器的意义在于如果 XamlType.TypeConverterXamlType.ValueSerializer 都存在,则类型转换器应用于加载路径,并且值序列化程序应用于保存路径。 如果 XamlType.TypeConverter 存在,但 XamlType.ValueSerializer 为 null,则类型转换器也用于保存路径。

其他值转换器

可以将值转换器扩展到类型转换器或标记扩展的特定模式之外。 但是,此自定义还需要重新定义由 .NET Framework XAML 服务提供的 XAML 类型系统。 现有的 XAML 类型系统具有一些用于类型转换器、标记扩展和值序列化程序的表示形式和报告系统,但它们不用于自定义形式的值转换。 如果要创建自定义值转换器,请使用 XamlValueConverter<TConverterBase> 类型。

类型转换器和标记扩展组合

在 XAML 中,标记扩展和类型转换器用于不同的情况。 尽管上下文可用于标记扩展,但在标记扩展实现中通常不检查标记扩展为其提供值的属性的类型转换行为。 换句话说,即使标记扩展返回一个文本字符串作为其 ProvideValue 输出,也不会对该字符串调用应用于特定属性或属性值类型的类型转换行为。 通常,标记扩展的用途是处理字符串并返回一个对象,而不涉及任何类型转换器。

值转换器的服务上下文

实现值转换器时,需要经常访问在其中应用了该值转换器的上下文。 此上下文称为服务上下文。 此上下文可能包括诸如活动的 XAML 架构上下文的信息、访问 XAML 架构上下文和 XAML 对象编写器提供的类型映射系统等。 有关值转换器可用的服务上下文以及如何访问服务上下文可提供的服务的更多信息,请参见可供类型转换器和标记扩展使用的服务上下文

请参见

参考

MarkupExtension

XamlObjectWriter

其他资源

XAML 的标记扩展概述

XAML 的类型转换器概述

可供类型转换器和标记扩展使用的服务上下文