在 .NET Framework 3.5 和 .NET Framework 3.0 中,Windows Presentation Foundation(WPF)和 Windows Workflow Foundation 都包含 XAML 语言实现。 许多为 WPF XAML 实现提供扩展的公共类型存在于 WindowsBase、PresentationCore 和 PresentationFramework 程序集中。 同样,System.Workflow.ComponentModel 程序集中也存在为 Windows Workflow Foundation XAML 提供扩展性的公共类型。 在 .NET Framework 4 中,某些与 XAML 相关的类型已迁移到 System.Xaml 程序集。 XAML 语言服务的常见 .NET Framework 实现可实现许多 XAML 扩展性方案,这些方案最初由特定框架的 XAML 实现定义,但现在是整体 .NET Framework 4 XAML 语言支持的一部分。 本文列出了迁移的类型,并讨论了与迁移相关的问题。
程序集和命名空间
在 .NET Framework 3.5 和 .NET Framework 3.0 中,WPF 实现以支持 XAML 的类型通常位于命名空间中 System.Windows.Markup 。 这些类型中的大多数都位于 WindowsBase 程序集中。
在 .NET Framework 4 中,有一个新的 System.Xaml 命名空间和一个新的 System.Xaml 程序集。 为 WPF XAML 最初实现的许多类型现在都作为任何 XAML 实现的扩展点或服务提供。 作为使其可在更常规的场景中使用的一部分,这些类型从其原始的 WPF 程序集被类型转发到 System.Xaml 程序集。 这样,XAML 扩展性方案就无需包含其他框架的程序集(例如 WPF 和 Windows Workflow Foundation)。
对于迁移的类型,大多数类型都保留在命名空间中 System.Windows.Markup 。 部分目的是为了避免在现有实现中逐个文件中断 CLR 命名空间映射。 因此, System.Windows.Markup .NET Framework 4 中的命名空间包含常规 XAML 语言支持类型(来自 System.Xaml 程序集)和特定于 WPF XAML 实现的类型(来自 WindowsBase 和其他 WPF 程序集)的混合体。 迁移到 System.Xaml 但以前存在于 WPF 程序集中的任何类型,在 WPF 程序集版本 4 中都支持类型转发。
工作流 XAML 支持类型
Windows Workflow Foundation 还提供了 XAML 支持类型,在许多情况下,这些类型与 WPF 等效的名称相同。 下面是 Windows Workflow Foundation XAML 支持类型的列表:
这些支持类型仍存在于适用于 .NET Framework 4 的 Windows Workflow Foundation 程序集中,仍可用于特定的 Windows Workflow Foundation 应用程序;但是,不应由不使用 Windows Workflow Foundation 的应用程序或框架引用它们。
MarkupExtension
在 .NET Framework 3.5 和 .NET Framework 3.0 中, MarkupExtension WPF 的类位于 WindowsBase 程序集中。 System.Workflow.ComponentModel 程序集中存在 Windows Workflow Foundation MarkupExtension的并行类。 在 .NET Framework 4 中,类 MarkupExtension 将迁移到 System.Xaml 程序集。 在 .NET Framework 4 中, MarkupExtension 适用于使用 .NET XAML 服务的任何 XAML 扩展性方案,而不仅仅是针对特定框架生成的扩展方案。 如果可能,框架中的特定框架或用户代码还应基于 XAML 扩展的 MarkupExtension 类生成。
MarkupExtension 支持服务类
适用于 WPF 的 .NET Framework 3.5 和 .NET Framework 3.0 提供了多个服务,这些服务可用于 MarkupExtension 实现者和 TypeConverter 实现,以支持 XAML 中的类型/属性用法。 这些服务如下:
注释
与标记扩展相关的 .NET Framework 3.5 的另一个服务是 IReceiveMarkupExtension 接口。
IReceiveMarkupExtension 未被迁移并被指定用于 .NET Framework 4。 过去使用 IReceiveMarkupExtension 的场景现在应该改为使用 XamlSetMarkupExtensionAttribute 具属性的回调。
AcceptedMarkupExtensionExpressionTypeAttribute 也标记为 [Obsolete]
。
XAML 语言功能
PresentationFramework 程序集中以前存在 WPF 的多个 XAML 语言功能和组件。 它们作为子 MarkupExtension 类实现,用于在 XAML 标记中公开标记扩展用法。 在 .NET Framework 4 中,这些项存在于 System.Xaml 程序集中,以便不包含 WPF 程序集的项目可以使用这些 XAML 语言级别功能。 WPF 为 .NET Framework 4 应用程序使用这些相同的实现。 与本主题中列出的其他情况一样,支持类型将继续存在于命名空间中 System.Windows.Markup ,以避免中断以前的引用。
下表包含 System.Xaml 中定义的 XAML 功能支持类的列表。
XAML 语言功能 | 用法 |
---|---|
ArrayExtension | <x:Array ...> |
NullExtension | {x:Null} |
StaticExtension | {x:Static ...} |
TypeExtension | {x:Type ...} |
虽然 System.Xaml 可能没有特定的支持类,但用于处理 XAML 语言语言功能的常规逻辑现在驻留在 System.Xaml 及其实现的 XAML 读取器和 XAML 编写器中。 例如, x:TypeArguments
是 XAML 读取器和来自 System.Xaml 实现的 XAML 编写器处理的属性;它可以在 XAML 节点流中记录,在默认(基于 CLR)的 XAML 架构上下文中处理,具有 XAML 类型系统表示形式等。 有关 XAML 参考文档的详细信息,请参阅 XAML 服务。
ValueSerializer 和支持类
此类 ValueSerializer 支持将类型转换为字符串,尤其是对于 XAML 序列化情况,其中序列化可能需要输出中的多个模式或节点。 在 .NET Framework 3.5 和 .NET Framework 3.0 中, ValueSerializer 适用于 WPF 的程序集位于 WindowsBase 程序集中。 在 .NET Framework 4 中,该 ValueSerializer 类位于 System.Xaml 中,适用于任何 XAML 扩展性方案,而不仅仅是针对在 WPF 上生成的方案。 IValueSerializerContext (支持服务)和 DateTimeValueSerializer (特定子类)也迁移到 System.Xaml。
XAML-Related 属性
WPF XAML 包含多个可应用于 CLR 类型的属性,用于指示其 XAML 行为的相关内容。 下面是 .NET Framework 3.5 和 .NET Framework 3.0 中 WPF 程序集中存在的属性的列表。 这些属性在 .NET Framework 4 中迁移到 System.Xaml。
杂项课程
接口 IComponentConnector 存在于 .NET Framework 3.5 和 .NET Framework 3.0 的 WindowsBase 中,但在 .NET Framework 4 中的 System.Xaml 中存在。 IComponentConnector 主要用于工具支持和 XAML 标记编译器。
接口 INameScope 存在于 .NET Framework 3.5 和 .NET Framework 3.0 的 WindowsBase 中,但在 .NET Framework 4 中的 System.Xaml 中存在。 INameScope 定义 XAML 名称范围的基本操作。
具有 WPF 和 System.Xaml 中存在的共享名称的 XAML 相关类
WPF 程序集和 .NET Framework 4 中的 System.Xaml 程序集中都存在以下类:
XamlReader
XamlWriter
XamlParseException
WPF 实现位于 System.Windows.Markup 命名空间和 PresentationFramework 程序集中。 System.Xaml 实现位于命名空间中 System.Xaml 。 如果您正在使用 WPF 类型或从 WPF 类型派生,通常应该使用 XamlReader 的 WPF 实现,而不是 System.Xaml 的 XamlWriter 实现。 有关详细信息,请参阅备注在System.Windows.Markup.XamlReader和System.Windows.Markup.XamlWriter。
如果您同时引用了 WPF 程序集和 System.Xaml,并且对System.Windows.Markup和System.Xaml命名空间都使用include
语句,则可能需要完全限定这些 API 的调用,以便解析类型时没有歧义。