有没有一种方法可以在运行时访问一个功能区(XML)?

13

我正在开发一个针对Word 2007的应用级插件。到目前为止,除了将插件的Ribbon界面转换为XML之外,我还没有遇到重大障碍。我必须使用Ribbon XML,因为我所开发的功能只能通过这种方式实现。问题在于,通过切换到Ribbon XML,我无法再通过Globals.Ribbons在运行时访问接口。这个链接http://msdn.microsoft.com/en-us/library/bb772088.aspx很好地解释了如何访问Visual Designer Ribbon,但它完全忽略了XML Ribbon的情况。具体而言,我需要能够访问一些可视化控件,例如标签。我该如何实现这一点?

3个回答

12

Globals.Ribbons是VSTO设计器的一个特性,如果您使用RibbonXML,则不会有此功能。 实际上,在设计师背后所做的事情是为Office创建了Ribbon XML,然后当Office发起回调时,VSTO将为该上下文(文档)引发适当的事件处理程序。因为您使用的是RibbonXML,所以完全绕过了VSTO Ribbon设计器支持(我更喜欢这种方式,它更快并且您有更多的控制权)。

在使用ribbon XML时,您必须为标签注册onLoad回调函数,Office将向您传递IRibbonControl,这将是标签,而您可以进行的操作受到限制。如果您想更改文本,则需要注册getText回调函数,然后将其使得ribbon控件无效,这将导致重新评估getText回调函数。

如果您能提供更多有关您实际想要实现的信息,那就太好了 =) 我觉得我的VSTO贡献项目在使用ribbon xml时也会让您的生活更加轻松,因为它为您提供了许多漂亮的Ribbon Designer功能。但请告诉我您想做什么,我可以为您提供更多信息。

谢谢, Jake


嗨,杰克。感谢你的回答。自从我发布这个问题以来,我实际上进行了大量的研究,并得出了相同的结论。我仍然希望有人能找到一些方法从Global.Ribbons访问接口。无论如何,我实际上转换了我的解决方案,现在我使用RibbonXML和回调来更改标签、显示信息和更改某些控件的可见性。 - AlgolDocks
非常感谢您的回复,Jake。MSDN 上似乎没有涉及到这个问题。使控件无效化的方法完美解决了这个问题。 - Daniel

6

在使用 Ribbon XML 时,我尝试了这个方法,但是我无法从 Globals.Ribbons. 访问 Ribbon1 属性。该属性根本不存在。

然而,我想出了另一种解决方案,基本上与适当的类型转换有关。

在 ThisAddIn.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;
}

1
你的回复在我类似的情况下非常有效。感谢您帮助我(以及可能许多其他读者解决这个非常困难的问题)。您抽出时间写下解决方案真是太好了,即使您可能是在一年后才看到这篇文章。我无法感谢您足够,在我已经花费了整整一天却毫无进展的情况下,您至少为我节省了一天的挣扎。 - nam

2

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

据我回忆,在Word启动阶段接近结束时才会填充它。

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


我正在尝试从Application_DocumentOpen访问Globals.Ribbons,这是在打开新文档时调用的函数。问题在于,这对于Visual Designer Ribbon曾经有效。然而,在切换之后,Globals.Ribbons.Count始终为0,尽管XML Ribbon已显示。 - AlgolDocks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接