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

时间:2013-06-20 14:23:24

标签: c# vsto outlook-addin

我正在开发一个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?

1 个答案:

答案 0 :(得分:22)

除非您使用(2)单独的加载项,否则无法同时使用功能区设计器功能区XML IAddInExtension.CreateRibbonExtensibilityObject仅在加载项的生命周期中调用一次。您可以选择使用 Designer XML 路径来实现界面。它们是两个独立的API挂钩。

功能区设计器对于那些刚接触Office Ribbon开发的人来说更像是一个支柱。 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因为模型完全不同。值得花时间投资功能区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传递Ribbon ID Type来加载要加载的XML ...

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