我正在将已弃用的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"按钮。
我想如果一个人熟悉事件和代表,这应该很简单,但我不是。我只是觉得我目前正在做的事情可以改进。
答案 0 :(得分:0)
我建议您不要在sudo usermod -aG vboxsf testuser
sudo reboot
中使用CancelDefault = true;
,只需从中调用m_SaveAllCommand_BeforeExecute
即可。