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

时间:2011-06-18 21:54:18

标签: c# vsto ribbon

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

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

我已经查看了Disable Own Word 2007 Add-In If No Document Loaded和其他相关问题。

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:3)

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

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

和处理程序

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

答案 2 :(得分:2)

有趣的是,我的VSTO Contrib项目(http://vstocontrib.codeplex.com/documentation)具有一些功能,可以简化功能区管理。

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

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