可以在WPF中使用与XAML 2009相关的标记扩展吗?

我在谈论扩展,例如x:Referencex:FactoryMethod , 这里集体出现。 我在网上阅读了很多相互矛盾的信息,包括MSDN,Stackoverflow和其他来源。

我将以x:Reference为例进行讨论,但我实际上也指的是其他标记扩展。 混淆的主要原因如下MSDN的摘录:

WPF中的XAML 2009语言支持

在WPF中,您可以使用XAML 2009function,但仅适用于非WPF标记编译的XAML。 标记编译的XAML和BAMLforms的XAML目前不支持XAML 2009语言关键字和function。 请注意,在WPF中加载松散XAML的现有技术也可能对CLR类型和类型系统有安全性和访问限制,这些限制比标记编译的XAML更具限制性。 有关更多信息,请参阅安全性(WPF)或WPF安全策略 – 平台安全性。 XAML 2009还引入了其他function,可以修改以前的XAML 2006构造或修改基本标记表单。

x:参考标记扩展

x:Reference是在XAML 2009中定义的构造。在WPF中,您可以使用XAML 2009function,但仅适用于非WPF标记编译的XAML。 标记编译的XAML和BAMLforms的XAML目前不支持XAML 2009语言关键字和function。

但是,以下段落出现在前一段之前(即关于x:Reference那一段)。

在WPF和XAML 2006中,元素引用由ElementName绑定的框架级function处理。 对于大多数WPF应用程序和方案,仍应使用ElementName绑定。 此一般指导的例外情况可能包括存在数据上下文或其他范围考虑因素的情况,这些因素使得数据绑定不切实际且不涉及标记编译。

这里没有直接的矛盾,但这一段似乎说可以在应用程序中使用x:Reference 。 此外,关于x:Reference段落似乎是自动生成的,可能已经过时了。

然后,我们从“WPF 4 Unleashed”一书中摘录如下:

x:引用标记扩展通常与XAML2009function错误关联,这些function只能在撰写本文时从松散的XAML中使用。 虽然x:Reference是WPF 4中的一个新function,但只要您的项目针对.NET Framework的版本4或更高版本,就可以在XAML2006中使用它。

我们还有以下Stackoverflow问题,其中一些问题的答案相互矛盾,而且没有一个明显正确:

  1. 什么是x的替代品:参考?
  2. XAML 2009 – x:参考 – 使用它的任何缺点?
  3. 何时是x:WPF中的引用已解决,为什么XAML元素顺序会影响它?

最后,我个人使用x:Reference扩展,它似乎在WPF应用程序中工作,无论MSDN说什么,即使Visual Studio有时会抱怨奇怪的事情(或者它可能是ReSharper),例如在标记。

了解实际问题,

  1. 可以在WPF应用程序中使用XAML 2009(全部或部分)吗?
  2. 这些特定扩展可以用于编写WPF应用程序吗? 使用它们有任何限制吗?
  3. 为什么所有这些都有这么多混乱?

我会从最后开始:


Why is there so much confusion regarding all of this?

也许是因为到目前为止,包括WPF 4.5的版本,几乎完全缺乏对XAML 2009的支持。来自Matthew MacDonald WPF 4.5, Chapter 2书的自由式引用:

最低改进XAML 2009仍未完全实施。 它们仅支持不相关的文件XAML,但不支持在任何地方使用的Page (编译资源)的资源类型。 可能, XAML 2009永远不会成为WPF的完全集成部分,因为它提供的改进尤其不重要,因为XAML编译器的任何更改都会产生安全性和性能问题。

关于XAML 2009的未来,那么我们不能肯定它何时会完全支持,但我们知道目前它不存在。


Can these specific extensions be used in writing WPF applications? Are there any limitations in using them?

是的,可以在WPF 4.0和WPF 4.5中使用某些扩展,例如: x:Array和其他类型,以及x:Referencex:FactoryMethod 。 我个人在XAML 2009中使用类型,并没有注意到任何错误。

关于x:Reference可以说,在Visual Studio 2010它不能正常工作:当使用x:Reference作为某个Control的Target时,Visual Studio设计器会抛出InvalidOperationExceptionexception并显示以下消息:

服务提供商缺少INameResolver服务。

该项目将编译和执行没有任何问题,但由于exception,将禁用出现x:ReferenceDesigncanvas。 就个人而言,我有时会出现,有时不会出现,但应该忽略它。

但我几乎完全知道版本WPF 4.5以及Visual Studio中的内容比2010年更多,这个bug已得到修复。 有关详细信息,请参阅此link

关于x:FactoryMethod也在这里,并非一切顺利,对于我在WPF 4.0中,VisualStudio 2010程序没有用它编译。 还在connect.microsoft.com上创建了一个错误报告,但微软的代表说:

WPF团队最近审查了这个问题,并且不会解决这个问题,因为此时团队正在关注影响最多WPF开发人员的bug。 如果您认为这是错误解决的,请使用任何必要的支持细节重新激活此错误。


Can XAML 2009 be used (in whole or in part) in WPF applications?

一个明确的答案:部分可以使用,但可能不适用于WPF和Visual Studio的每个版本。

如果您的项目计划在将来移植到WPF版本<4.0或更高版本,或者在其他平台上,例如Silverlight,Windows Phone,我认为最好避免使用XAML 2009,因为不能保证它们会成为它,至少部分支持。 例如,在Silverlight中,XAML 2009没有支持,甚至还没有完全支持XAML 2006。 可能是项目的很大一部分可能依赖于XAML 2009,因此必须花费一定的时间和资源来摆脱这种依赖。 在这种情况下,最好使用更通用的解决方案。

如果您使用的是WPF 4.0及更高版本,并且没有计划移植到其他平台,我认为部分可以在测试之后使用XAML 2009。

有关更多信息,我建议您熟悉XAML 2009表示法:

MSDN: Microsoft Domain-Specific Languages