Outlook上下文菜单项单击触发多次

本文关键字:单击 上下文 菜单项 Outlook | 更新日期: 2023-09-27 18:24:34

这里已经有人问过这个问题,但我只是对给出的答案不满意。

我当前正在向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中显示上下文菜单时,Click处理程序(FilingRules_Click)都会被触发那么多次。因此,如果我右键单击3次,处理程序将执行3次,依此类推

一定有比上面链接的问题中的破解更好的方法来实现这一点。

我试过:

  1. 在添加CommandBarButtons之前删除它们-但是它们不存在!!因为每次隐藏Outlook上下文菜单时,自定义项目都会自动删除
  2. 将控件存储在列表中,然后尝试删除处理程序-这会产生AV,因为菜单隐藏后按钮不再存在
  3. 没有ItemContextMenuHidden()事件可供我挂钩,否则我会尝试的
  4. 在外接程序启动时添加项(即,在没有ItemContextMenuDisplay()处理程序的情况下只添加一次),但是,由于显示菜单时总是清除这些项,因此这些项永远不会出现

有人有其他建议吗?

Outlook上下文菜单项单击触发多次

解决了问题。

  1. 将命令按钮定义为类级静态变量
  2. CCD_ 2的附件事件CCD_。

    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;
        }
    }