如何定位 Outlook 2007/2010 VSTO 上下文菜单按钮

本文关键字:2010 VSTO 上下文 按钮 菜单 2007 Outlook 何定位 定位 | 更新日期: 2023-09-27 18:35:37

我有一个 Outlook 2007/2010 加载项,其中我已成功将上下文菜单按钮添加到资源管理器。按钮本身显示正确且工作正常,但是我无法将其放置在上下文菜单上的内置控件上方,它总是添加到底部。我使用 VSTO 3.0 为 Outlook 2003 加载项创建了相同的按钮,并且相同的代码创建了一个位于上下文菜单顶部"打开"按钮上方的按钮。

我的代码如下

 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()方法的"Before"参数,但无济于事。我怀疑问题是在其他内置控件添加到上下文菜单之前触发了 ItemContextMenuDisplay 事件,而 Outlook 2003 加载项按钮是在由 Explorer.CommandBars.OnUpdate 事件触发的方法中创建的,该事件在 VSTO 4.0 资源管理器对象中不存在。

是否可以添加不在 VSTO 4.0 for Outlook 07/10 上下文菜单底部的按钮?

如何定位 Outlook 2007/2010 VSTO 上下文菜单按钮

> 在 Outlook 2003 和 2007 中,上下文菜单是基于命令栏的,并使用上面提供的代码创建。在 Outlook 2010 中,上下文菜单现在基于功能区,并且通常使用 XML 声明。

从 Office 2010 中的自定义上下文菜单:

在 Office 2010 Microsoft之前,在 Office Fluent 功能区用户界面 (UI) Microsoft中自定义上下文(右键单击)菜单的唯一方法是使用 CommandBars 解决方案。在 Office 2010 中,您可以自定义内置上下文菜单,就像自定义功能区 UI 的其他组件一样。此基于 XML 的上下文菜单扩展性模型基于熟悉的功能区扩展性模型。这意味着您可以使用当前用于自定义功能区 UI 的相同 XML 标记和回调。此外,通过功能区 UI 扩展性启用上下文菜单自定义不会"中断"以前编写的命令栏解决方案。

Outlook 2010 支持基于 CommandBar 的控件的向后兼容性,但有一些注意事项;无法定位控件可能是其中之一。

我的建议是让您的外接程序检测正在运行的 Outlook 版本是 2003/2007 还是 2010,如果是后者,请创建基于功能区的控件而不是基于 CommandBar 的控件。您将需要研究如何相应地调整代码;例如,可以通过在<button>元素中声明insertBeforeMso属性来执行定位。

附言我鼓励您考虑切换到商业第三方产品 Addin Express for Microsoft Office 和 .NET 来扩展 Office 应用程序的 UI;它大大简化了VSTO的过程。您仍然需要创建单独的ADXContextMenu(基于 CommandBar)和AdxRibbonContextMenu(基于功能区),但该过程几乎可以完全使用直观的可视化设计器来完成。