我有一个Outlook 2007/2010加载项,我已成功将一个上下文菜单按钮添加到资源管理器中。按钮本身显示正常并且工作正常但是我无法将其放置在上下文菜单上的内置控件上方,它始终添加到底部。我使用VSTO 3.0为Outlook 2003加载项创建了相同的按钮,相同的代码创建了一个位于' Open'上方的上下文菜单顶部的按钮。按钮。
我的代码在
下面 void Application_ItemContextMenuDisplay(CommandBar CommandBar, Selection Selection)
{
if (Selection.Count != 1) return;
CommandBarControl rootButton = CommandBar.Controls.Add(MsoControlType.msoControlButton, Type.Missing, "Create Heat Call", 1, Type.Missing);
CommandBarButton button = (CommandBarButton)rootButton;
button.BeginGroup = true;
button.Tag = "CreateHeatCall";
button.Caption = "Create Heat Call";
button.Style = MsoButtonStyle.msoButtonIconAndCaption;
button.Visible = true;
button.Picture = GetImage();
button.Mask = GetImageMask();
selection = Selection;
((CommandBarButton)rootButton).Click += new _CommandBarButtonEvents_ClickEventHandler(ThisAddIn_Click);
}
我尝试过使用'之前' CommandBar.Controls.Add()方法的参数无济于事。我怀疑问题是在将其他内置控件添加到上下文菜单之前触发了ItemContextMenuDisplay事件,而在Explorer.CommandBars触发的方法中创建了Outlook 2003加载项按钮。在VSTO 4.0 Explorer对象中不存在的OnUpdate事件。
是否可以在VSTO 4.0 for Outlook 07/10中添加一个不在上下文菜单底部的按钮?
答案 0 :(得分:3)
在Outlook 2003和2007中,上下文菜单是基于CommandBar的,并使用上面提供的代码创建。在Outlook 2010中,上下文菜单现在基于功能区,通常使用XML声明。
来自Customizing Context Menus in Office 2010:
在Microsoft Office 2010之前,在Microsoft Office Fluent功能区用户界面(UI)中自定义上下文(右键单击)菜单的唯一方法是使用CommandBars解决方案。在Office 2010中,您可以像使用功能区UI的其他组件一样自定义内置上下文菜单。这种基于XML的上下文菜单扩展性模型基于熟悉的Ribbon扩展性模型。这意味着您可以使用当前用于自定义功能区UI的相同XML标记和回调。此外,通过功能区UI可扩展性启用上下文菜单自定义不会“破坏”以前编写的命令栏解决方案。
Outlook 2010支持基于CommandBar的控件的向后兼容性,但有一些警告;无法定位控件可能就是其中之一。
我的建议是让您的加载项检测正在运行的Outlook版本是2003/2007还是2010,如果是后者,则创建基于Ribbon的控件而不是基于CommandBar的控件。您需要调查如何相应地调整您的代码;例如,可以通过在insertBeforeMso
元素中声明<button>
属性来执行定位。
P.S。我鼓励您考虑切换到商业第三方产品Add-in Express for Microsoft Office and .NET以扩展Office应用程序的UI;它比VSTO大大简化了流程。您仍然需要创建单独的ADXContextMenu
(基于CommandBar)和AdxRibbonContextMenu
(基于功能区),但这个过程几乎可以完全使用直观的可视化设计师完成。