在 WPF 中使用 Interaction.Triggers

本文关键字:Interaction Triggers WPF | 更新日期: 2023-09-27 18:32:57

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

"C:''程序文件 (x86(''Microsoft SDKs''Expression''Blend.NETFramework''v4.0''Libraries''System.Windows.Interactivity.dll">

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

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

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

我已经看到许多将 Interaction.Trigger 与 WPF 一起使用的示例,我认为应该没有任何问题。我做错了什么?

在 WPF 中使用 Interaction.Triggers

嗯,

肯定有什么奇怪的事情发生。 这是我发现的:

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

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

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

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