在WPF中使用Interaction.Triggers

时间:2012-05-01 06:33:37

标签: 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   的SDK \表达\ Blend.NETFramework \ V4.0 \库\ System.Windows.Interactivity.dll“

因此,我使用ILDisassе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的例子,我认为应该没有任何问题。我做错了什么?

1 个答案:

答案 0 :(得分:4)

嗯,肯定会有一些奇怪的事情发生。这是我发现的:

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

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

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

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