Я пишу функциональность устаревшего VS Addin в расширение пакета для VS 2015.Перехватив стандарт «Save All» команду Visual Studio
В расширения пакета есть окно инструментов с панелью инструментов, содержащей несколько кнопок, которые выполнить команды. Среди них есть кнопка «Сохранить все», которая должна не только сохранять файлы решения на локальном диске, но и сохранять файлы обратно в базу данных, к которой подключен пользователь. В настоящее время это прекрасно. Тем не менее, пользователь, вероятно, щелкнет стандартную кнопку «Сохранить все» Visual Studio и ожидает, что файлы также будут записаны в базу данных. Поэтому мне нужно перехватить стандартную команду «Сохранить все» и добавить мой метод, который обрабатывает сохранение файлов в базе данных. Мне удалось это сделать, но это не так просто, как я думаю, это должно быть. Я не осведомлен о событиях и делегатах. Я читал об этом, и тогда я не использую его достаточно часто, а затем забываю, что я читаю, и так далее.
Таким образом, функциональность кнопки панели «Сохранить все» в расширении пакета содержится в файле 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 «Сохранить все» Команда кнопки выглядит следующим образом: В методе 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, что, я думаю, сигнализирует вызывающему, что оно вмешалось в эту команду, а не только слушателем. Должно ли оно быть истинным?
В любом случае, мой главный вопрос: как мне связать saveAllCommandEvents.BeforeExecute с SaveAllCommandCallback? Я думаю, было бы лучше, если бы SaveAllDocuments вызывали только из одного места в SaveAllCommandCallback, но я не знаю, как связать обратный вызов с событием стандартной кнопки Visual Studio «Сохранить все».
Я думаю, это должно быть простым, если вы знакомы с событиями и делегатами, но я не уверен. Я просто чувствую, что то, что я сейчас делаю, может быть улучшено.
Почему вы рекомендуете удалить его? – Igavshne
@Igavshne Поскольку вы не хотите запрещать сохранение файлов на диск, когда пользователь выбирает File.SaveAll. –
О да ... глупый момент. :-) – Igavshne