2016-11-03 3 views
0

Я пишу функциональность устаревшего 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 «Сохранить все».

Я думаю, это должно быть простым, если вы знакомы с событиями и делегатами, но я не уверен. Я просто чувствую, что то, что я сейчас делаю, может быть улучшено.

ответ

0

Я рекомендую не использовать CancelDefault = true; в m_SaveAllCommand_BeforeExecute и просто позвонить SaveTheFilesBackToTheDatabase().

+0

Почему вы рекомендуете удалить его? – Igavshne

+0

@Igavshne Поскольку вы не хотите запрещать сохранение файлов на диск, когда пользователь выбирает File.SaveAll. –

+0

О да ... глупый момент. :-) – Igavshne

Смежные вопросы