修改Office功能区控制VSTO中应用程序中其他位置的状态

时间:2014-05-27 16:13:46

标签: c# xml excel vsto ribbonx

我有一个用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控件。

1 个答案:

答案 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。