从VSTO的应用程序中的其他位置修改Officefunction区控件状态

我有一个用XML创build的VSTO Addinfunction区,而不是devise者。 它有一个button,我只想在用户处于插件控制范围时启用。

我有callback设置工作正常,当function区加载。

Ribbon1.cs代码

  public bool refreshButtonState; public void Ribbon_Load(Office.IRibbonUI ribbonUI) { this.ribbon = ribbonUI; refreshButtonState = false; ribbon.InvalidateControl("btnRefreshQuery"); } public bool refreshEnabled(Office.IRibbonControl control) { return refreshButtonState; } 

我捕获了一个工作表更改事件来监视用户在下面的范围。

ThisAddIn.cs代码

  void ThisWorkbook_SheetChange(object ws, Excel.Range rng) { //Disable Button state here. if (rng.ListObject != null) { if (rng.ListObject.Name.StartsWith(LO_PREFIX)) { //Enable Button state here. } } } 

我不能仅仅从Globals.Ribbon.Ribbon1那里Globals.Ribbon.Ribbon1这个带子,因为在我所做的研究中已经有很多次提到过了。 使用XMLdevise器不会授予此function。

将我的表单监听function移动到function区似乎有很多工作,对我来说,它们属于插件,而不是function区,因为它们为插件提供了其他function。 我可能错过了显而易见的东西,但是存在的文档几乎不存在。 除了提问者或回答者不知道的一堆论坛问题之外。

TLDR:更改属性并从不属于function区类的代码中删除RibbonX控件。

我想到了。 或者至less有一种方式去那里。 我正在考虑在function区类中停放一个监听器来处理Addin类中的一个事件。

我用这个作为参考。

在我的ThisAddin类中,我创build了一个事件。

  public delegate void UpdateRibbon(object source, StateChangeArgs e); public event UpdateRibbon OnUpdateRibbon; 

和EventArgs类

 public class StateChangeArgs : EventArgs { private bool EventInfo; public StateChangeArgs(bool state) { EventInfo = state; } public bool GetInfo() { return EventInfo; } } 

向Ribbon添加了一个侦听器和def

 Globals.ThisAddIn.OnUpdateRibbon +=new ThisAddIn.UpdateRibbon(ThisAddIn_OnUpdateRibbon); 

  public void ThisAddIn_OnUpdateRibbon(object a1, StateChangeArgs e) { refreshButtonState = e.GetInfo(); ribbon.InvalidateControl("btnRefreshQuery"); } 

然后在Addin举起这个事件

 OnUpdateRibbon(this, new StateChangeArgs(true)); 

伟大的工程/ flex。