12

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

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

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

我要覆盖的基类实现“返回一个 RibbonManager 对象,该对象代表项目中的所有 Ribbon(可视化设计器)项”。

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

4

1 回答 1

25

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

对于那些刚接触 Office Ribbon 开发的人来说, Ribbon Designer更像是一个拐杖。一旦您熟悉了Ribbon XML方法- 它会简单得多,并且您可以更好地控制行为(正如您在 OP 中指出的那样)。您可以使用 Ribbon Designer 表面的上下文菜单从 Ribbon Designer 迁移到 XML - 尽管由于模型完全不同,因此需要对图像和回调进行一些返工。值得您花时间在Ribbon XML上进行投资,因为它是扩展上下文菜单(CommandBars已弃用)和 Backstage 视图的唯一方法,因为没有设计器

功能区 XML 路由

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

然后在ContactButtonOverrides...您可以触发要加载IRibbonExtensibility.GetCustomUI的 XML 通过哪个传递功能区 ID 类型...

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 "";
    }
}

丝带设计师路线

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() });
    }
}
于 2013-06-21T16:30:05.263 回答