2012-02-14 17 views
1

これは既に質問されていますhere、しかし私はちょうど与えられた答えに満足していません。Outlookのコンテキストメニューのアイテムを複数回クリックしてクリック

現在、Outlookにカスタムコンテキストメニューを追加しています。コードは次のとおりです。私は、アプリケーションを実行すると

void Application_ItemContextMenuDisplay(Microsoft.Office.Core.CommandBar CommandBar, Microsoft.Office.Interop.Outlook.Selection Selection) 
    { 
     if (Online) 
     { 
      foreach (string category in FilingRuleManager.FilingRuleCategories) 
      { 
       Office.CommandBarPopup cb = CommandBar.Controls.Add(Office.MsoControlType.msoControlPopup, missing, missing, missing, true) as Office.CommandBarPopup; 
       cb.BeginGroup = true; 
       cb.Visible = true; 
       cb.Tag = MENUNAME; 
       cb.Caption = category; 
       //now add the filing rules as a sub menu 
       foreach (FilingRuleDB rule in FilingRuleManager.FilingRules.Values) 
       { 
        if (rule.RuleCategory == category) 
        { 
         Office.CommandBarButton cbSub = cb.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, missing, true) as Office.CommandBarButton; 
         _FilingRules.Add(cbSub); 
         cbSub.Visible = true; 
         cbSub.Caption = rule.RuleName; 
         cbSub.Tag = rule.FilingRuleID.ToString(); 
         cbSub.Click += new Office._CommandBarButtonEvents_ClickEventHandler(FilingRules_Click); 
        } 
       } 
      } 
     } 
    } 

、私はOutlookでクリックハンドラ(FilingRules_Click)をコンテキストメニューを表示するたびに何回もすることを発射されます。だから私は3回右クリックした場合、ハンドラは3回実行されます。

上記にリンクされた質問のハッキングよりも優れた方法が必要です。

私が試してみました:

  1. はちょうどそれらを追加する前にCommandBarButtonsを削除する - しかし、彼らは存在しません! Outlookのコンテキストメニューが非表示になるたびに、カスタムアイテムは自動的に削除されます。
  2. リストにコントロールを格納してからハンドラーを削除しようとすると、メニューが非表示になってもボタンが存在しなくなるため、AVになります。
  3. 私のためにItemContextMenuHidden()イベントがフックする必要はありません。
  4. アドインが開始されたとき(つまり、ItemContextMenuDisplay()ハンドラなしで1回のみ)のアイテムを追加しますが、メニューが表示されたときに常にクリアされるため、項目は表示されません。

他に誰かがお勧めしますか?

答えて

2

問題を解決しました。

  1. クラスレベルの静的変数
  2. アタッチメントイベントOutlook.ApplicationためContextMenuCloseとしてコマンドボタンを定義します。

    outlookInstance.ContextMenuClose += new ApplicationEvents_11_ContextMenuCloseEventHandler(outlookInstance_ContextMenuClose); 
    
  3. コード

    void outlookInstance_ContextMenuClose(OlContextMenu ContextMenu) 
    { 
        if (ContextMenu == OlContextMenu.olItemContextMenu) 
        { 
         ContextIndexButton.Click -= new _CommandBarButtonEvents_ClickEventHandler(<your method>); 
         ContextIndexButton = null; 
        } 
    } 
    
+0

興味深いのような方法を実装し、私はこの私の終わりをしようとします。ありがとう – Simon