【问题标题】:Modifying Office ribbon controls states from elsewhere in the application in VSTO在 VSTO 中从应用程序的其他位置修改 Office 功能区控件状态
【发布时间】:2014-05-27 16:13:45
【问题描述】:

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

【问题讨论】:

    标签: c# xml excel vsto ribbonx


    【解决方案1】:

    我想通了。或者至少是到达那里的一种方式。我正在考虑为 Addin 类中的事件在 Ribbon 类中放置一个侦听器。

    我使用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;
        }
    
    }
    

    在功能区中添加了一个监听器和定义

    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));
    

    很好用 /flex。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2019-11-15
      • 1970-01-01
      相关资源
      最近更新 更多