我正在尝试将一个菜单项添加到附件上下文菜单中。问题是该项目没有显示。我已经看到一些例子,他们说这段代码应该有效:
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();
,那么菜单项将显示(注意缺少的图标),但是当它被点击时,上下文菜单将再次显示:
不调用commandBar.ShowPopup();上下文菜单看起来像往常一样,但它缺少我的自定义项目:
编辑:我正在使用Visual Studio 2013和Outlook 2010
答案 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答案中。
答案 1 :(得分:-1)
不推荐使用命令栏,除了以编程方式运行控件外,不应再使用它们(请参阅ExecuteMso)。您需要使用功能区UI(也称为Fluent UI)。有关详细信息,请参阅Extending the User Interface in Outlook 2010。
在以下系列文章中阅读有关Fluent UI的更多信息:
如果您需要根据上下文隐藏或显示某些控件,您可以处理功能区回调,您可以决定是否应该向用户显示控件。