VSTO - 是不是可以同时拥有设计器和 XML 功能区?

Posted

技术标签:

【中文标题】VSTO - 是不是可以同时拥有设计器和 XML 功能区?【英文标题】:VSTO - Is it possible to have both designer and XML ribbons?VSTO - 是否可以同时拥有设计器和 XML 功能区? 【发布时间】:2013-06-17 11:03:43 【问题描述】:

我正在开发一个 Outlook 2010 加载项,该加载项具有使用 Visual Studio 2010 功能区设计器创建的多个功能区。我制作了一个额外的 XML 功能区(我需要覆盖一些内置功能区按钮的默认行为,而设计器无法做到这一点)。

启用 XML 功能区会禁用所有设计器功能区,因为我必须覆盖 CreateRibbonExtensibilityObject(ContactButtonOverrides 是我的 XML 功能区):

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()

    return new ContactButtonOverrides();

我将覆盖“returns a RibbonManager object that represents all Ribbon (Visual Designer) items in the project”的基类实现。

有什么方法可以同时使用 XML 功能区和设计师制作的功能区吗?有没有办法将我的 XML 功能区添加到默认的 RibbonManager?

【问题讨论】:

如果您有兴趣,请提交:***.com/documentation/outlook-addin/commit 【参考方案1】:

除非您使用 (2) 个单独的插件,否则无法同时使用 Ribbon DesignerRibbon XMLIAddInExtension.CreateRibbonExtensibilityObject 在加载项的生命周期内只调用一次。您可以选择使用 DesignerXML 路由来实现接口。它们是两个独立的 API 挂钩。

功能区设计器对于那些刚接触 Office 功能区开发的人来说更像是一个拐杖。 Once you get familiar with the Ribbon XML approach - 它更简单,您可以更好地控制行为(正如您在 OP 中指出的那样)。你可以migrate from Ribbon Designer to XML using the Context Menu from the Ribbon Designer surface - 虽然有一些rework for imagery and callbacks 因为模型完全不同。值得您花时间投资 Ribbon XML,因为它是 only way to extend Context Menus (CommandBars are deprecated) and Backstage View as there is no designer。

Ribbon XML Route

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
    
        return new ContactButtonOverrides();
    

然后在ContactButtonOverrides...中,您可以通过IRibbonExtensibility.GetCustomUI触发要加载的XML,Ribbon ID Type...

public string GetCustomUI(string ribbonID)

    switch (ribbonID)
    
        case "Microsoft.Outlook.Appointment" : 
            return GetResourceText("OutlookRibbonApp.IPM.Appointment.Ribbon.xml");
        case "Microsoft.Outlook.Mail.Compose" : 
            return GetResourceText("OutlookRibbonApp.IPM.Note.Ribbon.xml");
        default:
            return "";
    

Ribbon Designer Route

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()

    if (myCondition == true)
    
        return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
            new Microsoft.Office.Tools.Ribbon.IRibbonExtension[]  new Ribbon1() );
    
    else
    
        return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
            new Microsoft.Office.Tools.Ribbon.IRibbonExtension[]  new Ribbon2() );
    

【讨论】:

谢谢。正是我想知道的。 使用Application.ItemContextMenuDisplay 事件不再支持 Outlook 2013 中的上下文菜单有点麻烦,这意味着您必须切换到 XML,这意味着您将所有功能区从设计器迁移到 XML。

以上是关于VSTO - 是不是可以同时拥有设计器和 XML 功能区?的主要内容,如果未能解决你的问题,请参考以下文章

VSTO保存自定义数据到工作簿

PHP-XML

通过标题名称而不是列索引引用 VSTO Excel ListObject 的列

3.4 迭代器

Qt 设计器和 Dock 小部件

重新安装VSTO