Outlook VSTO添加上下文菜单项

时间:2016-05-25 09:00:50

标签: c# vsto

我正在尝试将一个菜单项添加到附件上下文菜单中。问题是该项目没有显示。我已经看到一些例子,他们说这段代码应该有效:

this.Application.AttachmentContextMenuDisplay += new ApplicationEvents_11_AttachmentContextMenuDisplayEventHandler(ThisAddIn_AttachmentContextMenuDisplay);

private void ThisAddIn_AttachmentContextMenuDisplay(CommandBar commandBar, AttachmentSelection attachments)
{
    if (attachments.Count > 0)
    {
        var cbc = commandBar.Controls.Add(
                  MsoControlType.msoControlButton,
                  missing, missing, missing, true);

        cbc.Caption = "My custom item";
    }
}

触发事件ThisAddIn_AttachmentContextMenuDisplay并且附件计数大于零,但不显示菜单项。

奇怪的是,如果我调用commandBar.ShowPopup();,那么菜单项将显示(注意缺少的图标),但是当它被点击时,上下文菜单将再次显示:

Context menu when calling commandBar.ShowPopup();

不调用commandBar.ShowPopup();上下文菜单看起来像往常一样,但它缺少我的自定义项目:

Context menu without calling commandBar.ShowPopup()

编辑:我正在使用Visual Studio 2013和Outlook 2010

2 个答案:

答案 0 :(得分:2)

此信息链接到2016年删除的答案中。

以下示例使用Fluent UI通过VSTO将上下文菜单项添加到Outlook 2013。我尚未在Outlook 2016中对其进行测试。

首先,在Visual Studio中创建一个Outlook加载项。您可能首先需要通过“添加/删除程序”(或今年所说的任何方法)安装Visual Studio的Office开发功能。在“添加新项目”对话框中,您将在Visual C#/ Office / SharePoint / VSTO加载项下找到“ Outlook 2013和2016 VSTO加载项”项目类型。

创建项目。我的叫做OutlookAddIn。在project / Outlook / OutlookAddIn.cs中,我们找到了此类。它主要是生成的,但是我添加了CreateRibbonExtensibilityObject()方法。 OutlookAddInExtensibility类是我自己的类,定义如下。是的,当在适当的上下文中使用时,Fluent UI XML将<button .../>解释为“上下文菜单项”。

要测试项目,请关闭Outlook并在Visual Studio中按F5。它将在加载VSTO的情况下启动Outlook。

using Microsoft.Office.Core;

public partial class OutlookAddIn
{
    protected override IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
        return new OutlookAddInExtensibility();
    }

    private void ThisAddIn_Startup(object sender, EventArgs e)
    {
    }

    private void ThisAddIn_Shutdown(object sender, EventArgs e)
    {
        // Note: Outlook no longer raises this event. If you have code that 
        //    must run when Outlook shuts down, see https://go.microsoft.com/fwlink/?LinkId=506785
    }

    #region VSTO generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InternalStartup()
    {
        this.Startup += new System.EventHandler(ThisAddIn_Startup);
        this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
    }

    #endregion
}

OutlookAddInExtensibility.cs

ComVisible属性是必需的。

[ComVisible(true)]
public class OutlookAddInExtensibility : IRibbonExtensibility
{
    public string GetCustomUI(string RibbonID)
    {
        return
@"<?xml version=""1.0"" encoding=""UTF-8""?>
<customUI xmlns=""http://schemas.microsoft.com/office/2009/07/customui"">
    <contextMenus>    
        <contextMenu idMso=""ContextMenuMailItem"">
            <button 
                id=""MyContextMenuMailItem""
                label=""ContextMenuMailItem""
                onAction=""RibbonMenuClick""
                />
        </contextMenu>  
    </contextMenus>
</customUI>
";
    }

    public void RibbonMenuClick(IRibbonControl control)
    {
        var selection = control.Context as Microsoft.Office.Interop.Outlook.Selection;

        var mailItems = selection.OfType<Microsoft.Office.Interop.Outlook.MailItem>().ToList();

        System.Diagnostics.Trace.WriteLine($"RibbonMenuClick control: {control} type {control?.GetType().Name ?? "(null)"}");
    }
}

这是一个非常小的示例。批准的执行此操作的方法不是返回XML字符串,而是返回add a Ribbon item to the project。默认情况下,这将创建创建新功能区的代码。但是,此方法作为可重现的示例,更容易粘贴到StackOverflow答案中。

MSDN提供lavish documentation of the Fluent UI XML

答案 1 :(得分:-1)

不推荐使用命令栏,除了以编程方式运行控件外,不应再使用它们(请参阅ExecuteMso)。您需要使用功能区UI(也称为Fluent UI)。有关详细信息,请参阅Extending the User Interface in Outlook 2010

在以下系列文章中阅读有关Fluent UI的更多信息:

如果您需要根据上下文隐藏或显示某些控件,您可以处理功能区回调,您可以决定是否应该向用户显示控件。