【问题标题】:Is there a way to access a Ribbon (XML) at run time?有没有办法在运行时访问功能区(XML)?
【发布时间】:2011-04-25 15:38:32
【问题描述】:

我正在开发 Word 2007 应用级加载项。到目前为止,除了将加载项的 Ribbon 接口转换为 XML 之外,我还没有遇到任何重大障碍。我必须使用 Ribbon XML,因为我正在处理的功能只能通过这种方式完成。问题是,通过切换到 Ribbon XML,我无法在运行时通过 Globals.Ribbons 访问界面。此链接http://msdn.microsoft.com/en-us/library/bb772088.aspx 很好地解释了如何访问可视化设计器功能区,但它完全忽略了 XML 功能区的情况。具体来说,我需要能够访问一些可视控件,例如标签。我怎样才能做到这一点?

【问题讨论】:

    标签: c# ms-word vsto ms-office add-in


    【解决方案1】:

    Globals.Ribbons 是 VSTO 设计器的一项功能,如果您使用 RibbonXML 则没有此功能。 设计者实际上在幕后所做的是它将为 Office 创建功能区 xml,然后当 office 进行回调时,VSTO 将为该上下文(文档)引发适当的事件处理程序。因为您使用的是 RibbonXML,所以您完全绕过了 VSTO 功能区设计器支持(我更喜欢这种方式,它更快并且您拥有更多控制权)。

    使用功能区 XML,您必须为您的标签注册一个 onLoad 回调,然后 Office 将向您传递一个 IRibbonControl,这将是标签,您可以做的事情有限。如果您想更改文本,那么您必须注册一个 getText 回调,然后使该功能区控件无效,这将导致重新评估 getText 回调。

    获得有关您实际想要实现的目标的更多信息会很方便 =) 我觉得我的 VSTO contrib 项目也会让您的生活更轻松,因为它在使用功能区 xml 时为您提供了许多不错的功能区设计器功能。但是让我知道你想做什么,我可以给你更多的信息。

    干杯, 杰克

    【讨论】:

    • 嗨,杰克。感谢你的回答。自从我发布这个问题以来,我实际上做了很多研究,我得出了同样的结论。我仍然希望有人找到某种方法来访问 Global.Ribbons 的界面。无论如何,我实际上转换了我的解决方案,现在我使用 RibbonXML 和回调来更改标签、显示信息和更改某些控件的可见性。
    • 非常感谢您的回复/回答杰克。 MSDN 似乎在任何地方都没有涵盖这一点。使控件无效效果很好。
    【解决方案2】:

    在使用 Ribbon XML 时,我尝试了这个,但我无法从 Globals.Ribbons 访问 Ribbon1 属性.. 属性 simple 不存在..

    但是,我想出了另一个解决方案,它基本上与正确的类型转换有关。

    在这个AddIn.cs 中:

    private Microsoft.Office.Core.IRibbonExtensibility ribbonObj;
    protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
     ribbonObj = new Ribbon1(this);
     return ribbonObj;
    }
    
    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    { 
     // Calling the public method TEST() in Ribbon1.cs 
     //MyNameSpace is the namespace used in your project ie., your project name 
     ((MyNameSpace.Ribbon1)ribbonObj).TEST();
     // Calling the public variable flag in Ribbon1.cs  
     ((MyNameSpace.Ribbon1)ribbonObj).flag;
    }
    

    【讨论】:

    • 在我的类似案例中,您的回复就像一个魅力。感谢您在这个非常困难的问题上帮助我(可能还有许多其他读者)。很高兴你能花时间在那里写你的解决方案,即使你可能在差不多一年后阅读了这篇文章。在我已经在这个问题上花了一整天但没有运气之后,非常感谢你为我节省了至少一天的挣扎。
    【解决方案3】:

    这取决于您尝试访问 Globals.ribbons 的时间。

    我记得,直到 Word 启动阶段快结束时才会填充它。

    如果您尝试过早访问它,则还没有定义任何功能区。

    【讨论】:

    • 我正在尝试从 Application_DocumentOpen 访问 Globals.Ribbons,这是打开新文档时调用的函数。问题是这曾经适用于可视化设计器功能区。但是切换后,虽然显示的是 XML Ribbon,但 Globals.Ribbons.Count 始终为 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多