【问题标题】:Using Interaction.Triggers in WPF在 WPF 中使用 Interaction.Triggers
【发布时间】:2012-05-02 07:04:05
【问题描述】:

我一直在尝试将 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 的 Interaction 有 TriggersProperty 作为公共成员。

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

【问题讨论】:

    标签: c# wpf expression-blend


    【解决方案1】:

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

    • 使用 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 没有在任何地方使用。但是,Interaction.GetTriggers 在我的 WPF 代码中使用。所以我敢打赌,有一些 XAML 绑定反射魔法可以让这一切正常工作。我说“魔法”是因为我不明白。显然,Blend SDK 人员认为您应该只使用 XAML 中的 Behaviors 和 Triggers 附加属性,但 Prism 人员认为您也应该能够在代码中使用它。

    【讨论】:

    • 我猜第一个或第二个项目符号中有错字。事物不能在对象浏览器中公开而在 ILDASM 中是私有的,或者它们是两个不同的库。
    • 没有错字。它在对象浏览器和 ILDASM 中的显示方式不同。它们绝对是加载到这两个工具中的相同文件。如果您不相信我,请自行尝试。
    • 是的,这行得通。我一定是第一次打错了什么。看起来 Interaction.GetTriggers 首先检查 Interaction.Triggers 属性是否已设置,否则设置它。而Interaction.GetTriggers 是WPF 中获取Interaction.Triggers 的唯一合法途径。顺便说一句,由于某种原因,Interaction.Triggers 属性的名称是“ShadowTriggers”。在 WPF 中确实如此,不确定 Silverlight。
    猜你喜欢
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2016-04-27
    • 1970-01-01
    相关资源
    最近更新 更多