VSTO - 是否可以同时拥有设计器和XML色带?

njm*_*njm 9 c# vsto outlook-addin

我正在使用Outlook 2010加载项,该加载项具有使用Visual Studio 2010功能区设计器创建的多个功能区.我已经制作了一个额外的XML功能区(我需要覆盖一些内置功能区按钮的默认行为,这是设计人员无法完成的).

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

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
    return new ContactButtonOverrides();
}
Run Code Online (Sandbox Code Playgroud)

我正在覆盖的基类实现" 返回一个RibbonManager对象,该对象代表项目中的所有Ribbon(可视设计器)项 ".

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

Sli*_*SFT 23

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

功能区设计更加为这些新的Office Ribbon发展拐杖的.一旦您熟悉了Ribbon XML方法 - 它就会变得更加简单,您可以更好地控制行为(如您在OP中所指出的那样).您可以使用Ribbon Designer表面中的上下文菜单从Ribbon Designer迁移到XML - 尽管图像和回调有一些返工,因为模型完全不同.值得花时间投资Ribbon XML,因为它是扩展Context Menus(CommandBars不推荐使用)和Backstage View唯一方法,因为没有设计师.

功能区XML路由

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
        return new ContactButtonOverrides();
    }
Run Code Online (Sandbox Code Playgroud)

然后在ContactButtonOverrides...内你可以触发哪个XML加载,通过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 "";
    }
}
Run Code Online (Sandbox Code Playgroud)

功能区设计师路线

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() });
    }
}
Run Code Online (Sandbox Code Playgroud)