我正在讨论x:Reference
和x:FactoryMethod
等扩展程序,共同出现here。我在网上阅读了很多相互矛盾的信息,包括MSDN,Stackoverflow和其他来源。
我将以x:Reference
为例说明,但我实际上也指的是其他标记扩展。混淆的主要原因是以下MSDN摘录:
XAML 2009 Language Support in WPF
在WPF中,您可以使用XAML 2009功能,但仅适用于非WPF标记编译的XAML。标记编译的XAML和BAML形式的XAML目前不支持XAML 2009语言关键字和功能。 请注意,在WPF中加载松散XAML的现有技术也可能对CLR类型和类型系统提供安全性和访问限制,这些限制比标记编译的XAML更具限制性。有关更多信息,请参阅安全性(WPF)或WPF安全策略 - 平台安全性。 XAML 2009还引入了其他功能,可以修改以前的XAML 2006构造或修改基本标记表单。
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问题,其中一些问题的答案相互矛盾,而且没有一个是明显正确的:
最后,我亲自使用x:Reference
扩展程序,它似乎在WPF应用程序中工作,无论MSDN说什么,即使Visual Studio有时会抱怨奇怪的事情(或者它可能是ReSharper),例如标记中的空引用异常。
了解实际问题,
答案 0 :(得分: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和WPF 4.5中使用,例如:x:Array
和其他类型,以及x:Reference
,x:FactoryMethod
。我个人在XAML 2009中使用了类型,并没有注意到任何错误。
关于x:Reference
可以说, Visual Studio 2010
中的内容不能正常使用:当使用x:Reference
作为某些Control
的目标时1}},Visual Studio设计器抛出一个InvalidOperationException
异常,并带有消息:
服务提供商缺少INameResolver服务。
项目将编译并执行而不会出现任何问题,但Design
出现x:Reference
的画布将因异常而被禁用。就个人而言,我有时会出现,有时不会,但应该忽略它。
但我几乎完全知道版本WPF 4.5以及Visual Studio中的内容比2010年更多,这个bug已得到修复。有关详细信息,请参阅此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,因为不能保证它们会成为它,至少部分支持它。例如,在Silverlight
中,XAML 2009中没有支持,甚至还没有完全支持XAML 2006。可能是项目的很大一部分可能依赖于XAML 2009,因此必须花费一定的时间和资源来摆脱这种依赖。在这种情况下,最好使用更通用的解决方案。
如果您使用的是WPF 4.0及更高版本,并且没有计划移植到其他平台,我认为部分可以在测试后使用XAML 2009。
有关详细信息,建议您熟悉XAML 2009表示法: