0

在为 Visual Studio 2010 开发插件时,以下行失败:

CommandBarEvents handler = (EnvDTE.CommandBarEvents)m_VSStudio.DTE.Events.get_CommandBarEvents(popup);

更新:忘了告诉 m_VSStudio 是 DTE2 类型

其中 popup 是 CommandBarPopup 类型(对于 CommandBarControl 类型它可以工作)

该行因此异常而失败:

System.Runtime.InteropServices.COMException (0x80020003): Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))

完全相同的行在 Visual Studio 2008 中工作。

该行的目的是获得一个处理点击事件的处理程序,当单击弹出窗口时。

经过一番搜索,我找到了这个链接:http ://connect.microsoft.com/VisualStudio/feedback/details/524335/events-get-commandbarevents-exception-on-submenus-reproducible-bug-addin

这基本上表明这是一个已知的错误,不会被修复,因为有一个解决方法。但不幸的是,它没有说明解决方法:(

如果有人对解决方法有一个好主意,我会非常高兴?

我想听点击事件的原因是因为我想在某些条件下显示或隐藏子菜单项(CommandBarControl),当一个人点击一个菜单(CommandBarPopup)时。

因此,使用 click 事件以外的其他方法的解决方法也将受到赞赏。

4

2 回答 2

1

Jesper 和我在电子邮件中讨论过这个问题。他试图做的是确保他创建的弹出菜单的成员在显示之前处于正确的状态。他甚至在 CommandBarPopup 上使用 Click(在 2010 年迁移到 WPF 时已弃用)来了解何时需要进行状态更新。我提到了这样做的首选方法(即使在 2008 年)是在他的 AddIn 类上实现 IDtCommandtarget。VS shell 在需要查找命令状态时会调用此方法。它会在更新命令状态的所有“常规”时间调用此方法(即在需要时处于空闲状态,在显示菜单之前,等等)。转向这种方法适用于他的场景,并且似乎解决了他的问题。

瑞安

于 2010-06-06T16:07:42.403 回答
0

不幸的是,“我们的电子邮件通信”和“你找到了解决方法”这句话被放入了一个公共错误中,没有说明解决方法是什么。我怀疑这个人试图做一些与你完全不同的事情(即使他使用相同的事件机制来挂钩),所以也许我们找到了一种更好的方法来做他需要的事情。我想不出任何简单的方法来做你正在做的事情,但如果我理解你为什么要尝试做你正在做的事情(即你是在隐藏自己的命令吗?其他人的命令?目的是什么?)那么也许我们可以想到一些事情。欢迎直接给我发邮件,地址是 rmolden AT microsoft DOT com,不便之处,敬请见谅。我们也可以在这里跟进我们发现的任何工作,这样它就会一直被互联网记忆机器捕获。

于 2010-06-04T21:42:40.733 回答