在 WPF 中使用 Interaction.Triggers

Xan*_*rMK 3 c# wpf expression-blend

我一直在尝试使用 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 打开该路径上的文件,发现交互类实际上具有 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 的例子,我认为应该没有任何问题。我究竟做错了什么?

Mik*_*ost 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 人员认为您也应该能够从代码中使用它。