1

我有一个用 XML 而非设计器制作的 VSTO 插件功能区。它上面有一个按钮,我只想在用户处于插件控制的范围内时启用它。

我的回调设置在加载功能区时可以正常工作。

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 控件无效。

4

1 回答 1

2

我想到了。或者至少是到达那里的一种方式。我正在考虑在功能区类中为 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

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。

于 2014-05-27T18:34:20.540 回答