在VSTO中修改Office功能区可以控制应用程序中其他地方的状态
本文关键字:其他 应用程序 状态 控制 修改 VSTO Office 功能区 | 更新日期: 2023-09-27 18:05:37
我有一个我用XML制作的VSTO Addin ribbon,而不是设计师。它有一个按钮,我只希望当用户在插件控制的范围内时启用它。
我有一个回调设置,当ribbon加载时工作得很好。
Ribbon1.cs
code
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
中拾取丝带,因为在我所做的研究中已经多次建议。使用XML设计器不能授予此功能。
把我的表格监听功能移到功能区似乎要做很多工作,对我来说,它们属于外接程序而不是功能区,因为它们为外接程序提供了其他功能。我可能遗漏了一些明显的东西,但是存在的文档几乎不存在。除了成堆的论坛问题,提问者或回答者不明白它。
TLDR:从不属于功能区类的代码中更改属性并使RibbonX控件失效
我明白了。或者至少是到达那里的方法。我正在考虑在Ribbon类中为Addin类中的事件停放一个侦听器。
我用这个作为参考。
在我的ThisAddin
类中,我创建了一个事件。
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;
}
}
添加了一个监听器和def到Ribbon
Globals.ThisAddIn.OnUpdateRibbon +=new ThisAddIn.UpdateRibbon(ThisAddIn_OnUpdateRibbon);
和
public void ThisAddIn_OnUpdateRibbon(object a1, StateChangeArgs e)
{
refreshButtonState = e.GetInfo();
ribbon.InvalidateControl("btnRefreshQuery");
}
然后引发插件
中的事件OnUpdateRibbon(this, new StateChangeArgs(true));
Works great/flex