19

我说的是 和 之类的扩展名x:Reference,在这里x:FactoryMethod集体出现。我在网上阅读了很多相互矛盾的信息,包括 MSDN、Stackoverflow 和其他来源。

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

WPF 中的 XAML 2009 语言支持

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

x:参考标记扩展

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

但是,下一段出现在上一段之前(即 about x:Reference)。

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

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

然后,我们从“WPF 4 Unleashed”一书中摘录了以下内容:

x:Reference 标记扩展经常被错误地与 XAML2009 功能相关联,这些功能在撰写本文时只能从松散的 XAML 中使用。尽管 x:Reference 是 WPF 4 中的一项新功能,但只要您的项目面向 .NET Framework 4 或更高版本,就可以从 XAML2006 使用它。

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

  1. x:Reference 的替代品是什么?
  2. XAML 2009 - x:Reference - 使用这个有什么缺点吗?
  3. 何时解析 WPF 中的 x:Reference 以及为什么 XAML 元素顺序会影响它?

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

进入实际问题,

  1. XAML 2009 可以(全部或部分)在 WPF 应用程序中使用吗?
  2. 这些特定的扩展可以用于编写 WPF 应用程序吗?使用它们有什么限制吗?
  3. 为什么对这一切有如此多的困惑?
4

1 回答 1

19

我将从头开始:


Why is there so much confusion regarding all of this?

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

最低限度的改进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用作 a 的 Target 时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,因为无法保证它们会是它,至少部分支持。例如,Silverlight在 XAML 2009 中不支持,甚至 XAML 2006 也不完全支持。可能项目的很大一部分可以依赖 XAML 2009,因此必须花费一定的时间和资源来摆脱这种依赖。在这种情况下,最好使用更通用的解决方案。

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

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

MSDN: Microsoft Domain-Specific Languages

于 2014-03-17T06:15:07.580 回答