3

我一直在尝试将 System.Windows.Interactivity.Interaction 与 MS Expression Blend SDK for .NET 4 中的 WPF 一起使用。问题是我在那里找不到 Interaction.Triggers 附加属性。Interaction 类存在,但我只能看到其中的 4 个成员:Equals、GetBehaviors、GetTriggers、ReferenceEquals。我查看了我项目中对 System.Windows.Interactivity.dll 的引用的属性,发现路径是

“C:\Program Files (x86)\Microsoft SDKs\Expression\Blend.NETFramework\v4.0\Libraries\System.Windows.Interactivity.dll”

因此,我用 IL Disassеmbler 打开了该路径上的文件,发现 Interaction 类实际上具有 Triggers 附加属性,但该属性被声明为私有!然后我在 Prism SDK 的 \Lib\Desktop 目录中打开了相同的 dll 并在那里发现了相同的情况。这些 dll 的版本是 2.0.20525.0。还有一个带有 System.Windows.Interactivity dll 的 System.Windows.Interactivity.xml 文件。在其中,我发现了有关 TriggersProperty 的以下内容:

此属性不公开。这会强制客户端使用 GetTriggers 和 SetTriggers 方法来访问集合,确保集合存在并在使用之前设置。

但是我在那里没有找到任何 SetTriggers 方法。顺便说一句,Silverlight 的交互将 TriggersProperty 作为公共成员。

我已经看到了许多将 Interaction.Triggers 与 WPF 结合使用的示例,并且我认为应该没有任何问题。我究竟做错了什么?

4

1 回答 1

5

那么肯定有一些奇怪的事情发生了。这是我发现的:

  • 使用 Prism 4.1 中的 System.Windows.Interactivity.dll,Interaction.TriggersProperty在 VS2010 的对象浏览器中显示为公共字段。
  • 同一个程序集显示 TriggersProperty 是 ILDASM 中的私有字段。
  • 使用 Blend SDK for .NET 4 中的 System.Windows.Interactivity.dll,TriggersProperty 不会显示在对象浏览器中。
  • 同一个程序集显示 TriggersProperty 是 ILDASM 中的私有字段。

我没有解释。但是,我可以说,如果您只是<i:Interaction.Triggers>在 WPF XAML 中编写并引用 Prism 4.1 中的 System.Windows.Interactivity.dll,它就会按预期工作。

我尝试检查其他一些框架类以查看它是否是 ILDASM 中的错误,但所有这些都带有正确的访问修饰符。所以我不知道为什么 Prism 版本有效,但它似乎就是这样做的。我没有尝试过直接的 Blend SDK 版本,因为我不需要它。

编辑:更多信息:使用 Resharper 进行挖掘,我发现 Interaction.TriggersProperty 没有在任何地方使用。但是,Interaction.GetTriggers 在我的 WPF 代码中使用。所以我敢打赌,有一些 XAML 绑定反射魔法可以让这一切正常工作。我说“魔法”是因为我不明白。显然,Blend SDK 人员认为您应该只使用 XAML 中的 Behaviors 和 Triggers 附加属性,但 Prism 人员认为您也应该能够从代码中使用它。

于 2012-05-01T22:58:53.900 回答