2016-11-03 9 views
0

私はVS 2015のパッケージの拡張子では、Visual Studioコマンド

のパッケージの拡張に非推奨VSアドインの機能を書いています「すべてを保存」されコマンドを実行します。これらの中には、[すべて保存]ボタンがあります。このボタンは、ソリューションのファイルをローカルディスクに保存するだけでなく、ユーザーが接続されているデータベースにファイルを保存する必要があります。これは現在正常に動作します。しかし、ユーザーはおそらく標準の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に設定しています。これは、呼び出し元に対して、リスナーだけでなく、コマンドを妨害したと考えていると思います。 trueに設定する必要がありますか?

私の主な質問は、saveAllCommandEvents.BeforeExecuteをSaveAllCommandCallbackにリンクするにはどうすればいいですか?私はSaveAllCommandCallbackで1つの場所から呼び出されたSaveAllDocumentsを持っているほうがよいと思いますが、標準のVisual Studio "Save All"ボタンのコールバックをリンクする方法はわかりません。

イベントやデリゲートに精通していれば簡単だと思いますが、私はそうではありません。私は現在自分がやっていることが改善できると感じています。

答えて

0

m_SaveAllCommand_BeforeExecuteCancelDefault = true;を使用せず、SaveTheFilesBackToTheDatabase()と呼んでください。

+0

なぜ私はそれを削除することをお勧めしますか? – Igavshne

+0

@IgavshneユーザーがFile.SaveAllを選択したときにファイルをディスクに保存しないようにしたいからです。 –

+0

ああ...愚かな瞬間。 :-) – Igavshne

関連する問題