拦截标准"全部保存" Visual Studio命令

时间:2016-11-03 12:07:29

标签: c# events visual-studio-2015 event-handling

我正在将已弃用的VS Addin的功能编写到VS 2015的Package扩展中。

在包扩展中有一个工具窗口,其中包含一些工具栏,其中包含一些执行命令的按钮。其中,有一个“全部保存”。按钮,不仅应该将解决方案的文件保存到本地磁盘,还应该将文件保存回用户所连接的数据库。这目前工作正常。但是,用户可能会点击标准的Visual Studio' Save All'按钮,并期望文件也被写入数据库。所以我需要拦截标准' Save All'命令并添加我的方法来处理将文件保存到数据库。 我设法做到了这一点,但它并不像我认为的那样整洁。我对事件和代表都不了解。我读了一下,然后我不经常使用它,然后我忘了我读的东西等等。

所以' Save All'包扩展中的工具栏按钮在Package.cs文件中找到如下。在Initialize方法中:

protected override void Initialize()
    {


        OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
        if (null != mcs)
        {

            CommandID saveAllCommandID = new CommandID(new Guid(Guids.guidConnectCommandPackageCmdSet), (int)PkgCmdIDList.cmdidSaveAllCommand);
            command = new OleMenuCommand(new EventHandler(SaveAllCommandCallback), saveAllCommandID);
            command.BeforeQueryStatus += BeforeQueryStatusCallback;
            mcs.AddCommand(command);


        }

        visualStudioInstance = (DTE2)this.ServiceProvider.GetService(typeof(DTE));          

        CreateEventHandlers(visualStudioInstance);

    }

这是SaveAllCommandCallback:

    private void SaveAllCommandCallback(object caller, EventArgs args)
    {
        SaveAllDocuments();
        OutputCommandString("In SaveAll Command Callback");
    }

SaveAllDocuments是负责将文件保存到数据库的方法。我不认为有必要发布它。

我试图拦截标准的Visual Studio" Save All"按钮的命令如下: 在上面的Initialize方法中,有一个方法CreateEventHandlers:

private void CreateEventHandlers(DTE2 visualStudioInstance)
    {

        Events2 evs = visualStudioInstance.Events as Events2;
        Commands cmds = visualStudioInstance.Commands;

        Command cmdobj = cmds.Item("File.SaveAll", 0);
        saveAllCommandEvents = evs.get_CommandEvents(cmdobj.Guid, cmdobj.ID);
        saveAllCommandEvents.BeforeExecute += new _dispCommandEvents_BeforeExecuteEventHandler(m_SaveAllCommand_BeforeExecute);


    }

然后是m_SaveAllCommand_BeforeExecute:

private void m_SaveAllCommand_BeforeExecute(string Guid, int ID, object CustomIn, object CustomOut, ref bool CancelDefault)
    {
        SaveAllDocuments();
        CancelDefault = true;
    }

正如你所看到的,它调用SaveAllDocuments并将CancelDefault设置为true,我认为它向调用者发出信号,表明它已干扰命令而不仅仅是一个监听器。应该设置为true吗?

无论如何,我的主要问题是,如何将saveAllCommandEvents.BeforeExecute链接到SaveAllCommandCallback?我认为在SaveAllCommandCallback中只从一个地方调用SaveAllDocuments会更好,但我不知道如何将回调链接到标准Visual Studio" Save All"按钮。

我想如果一个人熟悉事件和代表,这应该很简单,但我不是。我只是觉得我目前正在做的事情可以改进。

1 个答案:

答案 0 :(得分:0)

我建议您不要在sudo usermod -aG vboxsf testuser sudo reboot 中使用CancelDefault = true;,只需从中调用m_SaveAllCommand_BeforeExecute即可。