VSTO:仅在加载文档时启用function区按钮

如何在加载文档时设置Word加载项中的function区按钮,并在没有加载文档时禁用,就像大多数内置按钮一样?

可以将全局标志绑定到按钮的“Enabled”属性,还是比它更复杂? 我知道我可以创建一个定时循环来检查Application.Documents中的更改,但是如果可能的话,我正在寻找“更干净”的东西。

我已经看过禁用自己的Word 2007加载项如果没有文档加载和其他相关的问题。

有几种方法可以解决这个问题。

首先,您可以创建一个公开公开的函数,该函数对按钮的启用状态返回true或false(但是您要确定它),然后定义ribbon xml以指向Enabled属性getter的该函数。 如果您正在处理基于IExtensibility的插件,那么这就是您必须采用的方式。

如果您正在处理VSTO,请在function区设计器中定义function区按钮,并在默认情况下将其设置为DISABLED。

然后,在STARTUP事件期间,挂钩WORD对象,特别是NEWDOCUMENT,DOCUMENTOPEN和WINDOWACTIVATE事件。

在每个事件的事件处理程序代码中,根据触发的事件以及当时激活的文档启用或禁用您的按钮。

请改用DocumentChange事件。 连接将是这样的:

Globals.ThisAddIn.Application.DocumentChange += new EventHandler(OnDocumentChange); 

和处理程序

 void OnDocumentChange() { this.myButton.Enabled = wordApp.Documents.Count > 0; } 

有趣的是,我的VSTO Contrib项目( http://vstocontrib.codeplex.com/documentation )具有一些使function区管理更简单的function。

最干净的方法是使用我的function区工厂,但是如果没有查看按钮状态的视图模型,则需要更新项目以禁用按钮。 事实上,这是一个我没有真正涵盖的场景。

您有一个加载项感兴趣的3个部分,视图(窗口),上下文(文档)和function区。 VSTO Contrib意味着您可以获得每个上下文的视图模型,并且它管理/抽象function区和视图,因此您看起来每个上下文都有一个function区,它会告诉您当前的活动视图(对于显示相同文档方案的多个窗口)。 缺少的部分是如果有一个function区,但没有上下文和视图模型,它应该使该function区控件无效并禁用它。 这应该是一个非常简单的变化,如果你有兴趣给VSTO Contrib的RibbonFactory一个旋转,我可以给我发电子邮件,我可以为你做这个改变。