【问题标题】:Outlook Context Menu item click fired multiple timesOutlook 上下文菜单项单击多次触发
【发布时间】:2012-03-30 16:21:08
【问题描述】:

已经有人问过here,但我对给出的答案不满意。

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

有人有其他建议吗?

【问题讨论】:

    标签: c# event-handling outlook-addin


    【解决方案1】:

    解决了这个问题。

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

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

    【讨论】:

    • 有趣,我会试试这个。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多