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

Gre*_*Ros 19 .net c# wpf xaml markup-extensions

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

我将以x:Reference一个例子来谈谈,但我实际上也指的是其他标记扩展.混淆的主要原因是以下MSDN摘录:

WPF中的XAML 2009语言支持

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

x:参考标记扩展

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

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

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

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

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

x:引用标记扩展通常与XAML2009功能错误关联,这些功能只能在撰写本文时从松散的XAML中使用.虽然x:Reference是WPF 4中的一个新功能,但只要您的项目针对.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. 为什么所有这些都有这么多的混乱?

Ana*_*aev 19

我将从最后开始:


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和4.5 WPF可以使用,例如:x:Array和其它类型的,以及x:Reference,x:FactoryMethod.我个人在XAML 2009中使用类型,并没有注意到任何错误.

关于x:Reference可以说,Visual Studio 2010它本身不能正常工作:当使用x:Reference某个目标时Control,Visual Studio设计器会抛出InvalidOperationException异常消息:

服务提供商缺少INameResolver服务.

该项目将编译和执行,没有任何问题,但由于异常Design,将x:Reference出现的画布将被禁用.就个人而言,我有时会出现,有时不会,但应该忽略它.

但我几乎确切地知道版本WPF 4.5以及可能对于Visual Studio而言比2010年更多这个错误已得到修复.欲了解更多信息请参阅本link.

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

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


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

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

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

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

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

MSDN: Microsoft Domain-Specific Languages