2012-02-14 72 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()處理程序),但是項目從不出現,因爲它們總是在顯示菜單時被清除。

有沒有人有另一個建議?

回答

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 2012-03-30 06:35:35

相關問題