1

我正在查看一些创建 Outlook 上下文菜单按钮的示例,如下所示:

    private void Application_ItemContextMenuDisplay(Microsoft.Office.Core.CommandBar CommandBar, 
                                                    Selection Selection)
    {

        var button = (Office.CommandBarButton)CommandBar.Controls.
                            Add(Office.MsoControlType.msoControlButton, missing,
                                missing, missing, missing);            
        button.accName = "SowSelectedItem";
        button.DescriptionText = "Show Selected item";
        button.Caption = button.DescriptionText;
        button.Tag = "ShowSelectedItem";
        button.Click += ContextMenuItemClicked;
    }

这一次就可以正常工作 - 它在菜单上创建一个按钮就好了,它是可点击的,我的事件处理程序在第一次访问时触发。

但是,菜单激活会反复触发,并且每次运行时似乎都添加了另一个事件处理程序(但菜单上只显示一个按钮),因此现在单击该按钮会多次触发处理程序 - 对于之前进行的每次访问一次 - 使用点击处理程序正在累积(即使我每次都添加一个新按钮)。

好的,所以我想我可以:

  • 设置一个标志并只加载一次按钮(在后续激活时不显示)
  • 缓存按钮并每次添加(也不会在后续激活时显示)
  • 缓存并使按钮每次可见并启用(不显示)

我觉得我在这里遗漏了一些东西。如何连接按钮,以便获得正确的按钮激活并且只命中一个事件处理程序?

4

1 回答 1

2

我仍然不太确定 Outlook 对按钮做了什么,但以下代码通过实现菜单激活和取消激活以及在取消激活中删除事件处理程序来解决该问题。

public partial class ContextMenuLookupAddin
{
    Outlook.Explorer currentExplorer = null;
    CommandBarButton contextButton = null;

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        currentExplorer = Application.ActiveExplorer();
        Application.ItemContextMenuDisplay += Application_ItemContextMenuDisplay;
        Application.ContextMenuClose +=Application_ContextMenuClose;
    }

    private void Application_ItemContextMenuDisplay(Microsoft.Office.Core.CommandBar CommandBar, 
                                                    Selection Selection)
    {
        if (contextButton == null)
        {
            contextButton = (Office.CommandBarButton)CommandBar.Controls.
                                Add(Office.MsoControlType.msoControlButton, missing,
                                    missing, missing, missing);

            contextButton.accName = "SowSelectedItem";
        }

        contextButton.DescriptionText = "Show Selected item";
        contextButton.Caption = contextButton.DescriptionText;
        contextButton.Tag = "ShowSelectedItem";
        contextButton.FaceId = 4000;
        contextButton.OnAction = "OutlookIntegration.ThisAddIn.ContextMenuItemClicked";
        contextButton.Click += ContextMenuItemClicked;
    }

    private void Application_ContextMenuClose(OlContextMenu ContextMenu)
    {
        contextButton.Click -= ContextMenuItemClicked;
        contextButton.Delete(missing);
        contextButton = null;
    }

    private void ContextMenuItemClicked(CommandBarButton Ctrl, ref bool CancelDefault)
    {
        if (currentExplorer.Selection.Count > 0)
        {
            object selObject = currentExplorer.Selection[1];
            if (selObject is MailItem)
            {
                // do your stuff with the selected message here
                MailItem mail = selObject as MailItem;
                MessageBox.Show("Message Subject: " + mail.Subject);
            }
        } 
    }
 }
于 2012-08-30T09:14:53.913 回答