我有一个用XML制作的VSTO Addin功能区,而不是设计器。它上面有一个按钮,我只想在用户处于插件控制的范围内时启用它。
我有回调设置,可以在加载功能区时正常工作。
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
拾取色带,因为在我做过的研究中已多次提出建议。使用XML设计器不会授予此功能。
将我的工作表监听功能移到功能区似乎需要做很多工作,对我来说,他们属于插件而不是功能区,因为它们为插件提供了其他功能。我可能遗漏了一些明显的东西,但存在的文档几乎不存在。除了大量的论坛问题,其中提问者或回答者没有得到它。
TLDR:更改属性并从不属于功能区类的代码中删除RibbonX控件。
答案 0 :(得分:2)
我明白了。或者至少是一种到达那里的方法。我正在考虑在Ribbon类中为Addin类中的事件停止一个监听器。
我使用this作为参考。
在我的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
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。