在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控件失效

在VSTO中修改Office功能区可以控制应用程序中其他地方的状态

我明白了。或者至少是到达那里的方法。我正在考虑在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