2012-02-14 65 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