Visual Studio添加上下文菜单不会接收事件

时间:2012-02-11 19:23:03

标签: c# visual-studio-2010 visual-studio-addins

我正在尝试使用视觉工作室插件,并且遇到了非常奇怪的行为。我正在添加一个右键单击上下文菜单项,我没有让事件触发除非我在OnConnect方法中放置一个断点并等待一段时间。我的表现与this article完全一样。

这是一个完全标准的加载项,代码如下:

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
    applicationObject = (DTE2)application;
    addInInstance = (AddIn)addInInst;

    var commandBars = ((CommandBars)applicationObject.CommandBars)["Code Window"];
    var popup = commandBars.Controls.Add(MsoControlType.msoControlButton,
                System.Reflection.Missing.Value, 
                System.Reflection.Missing.Value, 1, true);
    popup.Caption = "View graph";
    var commandBarEvents = (CommandBarEvents)(applicationObject.Events.CommandBarEvents[popup]);
    commandBarEvents.Click += ViewGraphClick;
}

private void ViewGraphClick(object commandbarcontrol, ref bool handled, ref bool canceldefault)
{
    var selection = (TextSelection)applicationObject.ActiveDocument.Selection;
    selection.Insert("Hello, world!");
    handled = true;
}

如果我在方法的早期等待断点,这个插件就可以了。如果我不等,它永远不会打电话给我的活动。但是,它会在所有情况下将我的项目添加到上下文菜单中。

据我所知,此方法仅被调用一次。关于我在这里做错了什么想法?

更新:我试图在OnStartup中添加相同的初始化代码。结果是一样的。我还尝试按照here显示的示例进行操作,但OnConnection仅在connectMode设置为Startup时调用一次。

更新2 我尝试了尽可能多的这种组合,移动所有初始化。最后,我放弃并开始使用另一个使用命令而不是普通上下文菜单的示例。从长远来看,这可能是一个更好的解决方案,但我仍然对原始代码不起作用的原因感兴趣。

1 个答案:

答案 0 :(得分:2)

将这些变量设为全局:

    CommandBarEvents commandBarEvents;
    CommandBar commandBars;
    CommandBarControl popup;

如果在OnConnection中创建这些对象,则一旦代码超出范围,它们就会被释放。