在 PDC 2009 上,Michael Shim 和 Rob Relyea 介绍了微软对 XAML 的未来规划。目前.NET 中有两个 XAML 实现,一个针对 Windows Workflow,另一个针对 Windows Presentation Foundation,因此想要使用 XAML 的开发者需要 WF 或是 WPF。
在.NET 4 中,微软于新的 System.XAML 程序库中加入了一个独立的 XAML 引擎。该版本只需 System.XML 与核心运行时即可,这对于那些想要使用 XAML 但又不想加载 Fx 程序库的应用来说再适合不过了。
微软对 .NET 4 中的 XAML Nodes Streams 进行了大幅度的提升。所谓 node stream 其实就是一个事件驱动的 API,用于与结构化数据协同工作。读者可能对基于 XML 的 SAX 风格的程序库比较熟悉。除了直接处理之外,在其他框架加载 XAML Node Streams 时它还可以修改 XAML。
作为.NET 4 重构的一部分,微软极大地提升了解析器的可扩展性。在.NET 3 中,扩展点仅仅局限于 IXamlTypeResolver、IUriConext 和 IProvideValueTarget。新的解析器可以通过这些接口注入很多其他的服务。但这些接口并非都是新引入的,只是此前没有公开而已,他们是:
- IRootObjectProvider
- IXamlNameResolver
- IXamlNameProvider
- IAmbientProviders
- IDestinationTypeProvider
- IXamlNamespaceProvider
- INamespacePrefixLookup
- IXamlSchemaContextProvider
- IXamlObjectWriterFactory
就像 XML 一样,XAML 也有两类解析 API。除了 XAML Node Streams 之外,还将有一个 XAML DOM。凭借 XAML Document Object Model,开发者可以一次性处理整个 XAML 树。开发者不仅可以直接处理节点树,还能够访问 LINQ provider。我们可以联合使用 XAML Node Streams 和 XAML DOM 解析器为静态分析工具如 FxCOP 增加支持。
到目前为止,我们仅仅谈到了解析工具,实际上微软还发布了语言的一个新版本,叫做 XAML 2009。XAML 2009 将完全支持泛型、非默认构造方法、工厂方法、内建类型并且可以定义新的属性。
需要注意的是 .NET 4、VS 2010 和 Blend 中的编译器与设计器将不会在此次发布中支持 XAML 2009。XAML 2009 只能用于“loose XAML”,比如 Workflow Foundation 所用的小个配置文件。其中的主要原因在于 WPF 设计器已经拥有了自己的解析器,而重写该解析器以使用这个公共解析器将要花费大量时间。
Silverlight 将与.NET 生态圈中的其余部分使用同样的 XAML 解析器。这么做是考虑到更好的错误检测以及未来对更多的 XAML 2006 和 2009 特性的支持。Silverlight 依然需要一个轻量级的运行时,因此微软采取逐步递进而不是大跃进的方式来增加特性。
到底通过什么可以让 Silverlight 使用统一的 XAML 解析器呢?答案就是之前提到的 IXamlSchemaContextProvider。通过创建一个 Silverlight 可以接受的特定于 XAML 子集的一个 schema context,工具就无需对 Silverlight 和基于 WPF 的 XAML 之间的差别进行硬编码了。据说 Expression Blend 团队对这个功能尤为感兴趣。
评论