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

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

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

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

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

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

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

function区设计器对于Office Ribbon开发新手来说更像是一个支柱。 熟悉Ribbon XML方法后 ,它就会变得更加简单,您可以更好地控制行为( 正如您在OP中指出的那样 )。 您可以使用Ribbon Designer表面中的上下文菜单从Ribbon Designer迁移到XML – 尽管图像和回调有一些返工,因为模型完全不同。 值得花时间投资Ribbon XML,因为它是扩展Context Menus( 不推荐使用CommandBars )和Backstage View的唯一方法,因为没有设计师 。

function区XML路由

 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() }); } }