在运行时更改XML功能区中的按钮和标签



我知道stackoverflow上已经有几个主题,但没有一个真正解决问题。下面是:由于Ribbon Designer的一些固有问题,我决定使用XML Ribbon来构建我的下一个Excel插件。但是,有时我需要根据用户的选择对功能区中的控件进行更改。例如,我需要更改标签的文本,并在某些情况下禁用一些控件。这就是我遇到瓶颈的地方。看起来没办法了。我试图将逻辑放在onAction回调中,如下所示:

public void LabelAction(IRibbonControl control)
{
    LabelControl label = (LabelControl)control;
    label.Label = "changed text";
}

但是这个强制转换不起作用,因为显然IRibbonControl接口与labelcontrol继承的RibbonControl类没有任何关系。我也找不到任何其他方法来访问任何XML功能区控件。有解决办法吗?或者我应该坚持使用Ribbon Designer?

您需要在设置项目标签的例程中完成此操作。

xml应该是这样的:

      <button id="SkLabelTest1" getLabel="GetLabelTest" onAction="SkLabelTest1"/>
      <button id="SkLabelTest2" getLabel="GetLabelTest" onAction="SkLabelTest2"/>

感兴趣的例程是getLabel

我已经做了一个例程来演示这一点。

首先,我给ThisAddin.cs添加了一个属性,让它读:

    public string _labelTest = string.Empty;
    public string LabelTest { get { return _labelTest; } set { _labelTest = value; } }

然后在我的色带处理代码中,我添加了getLabel例程:

    public string GetLabelTest(Office.IRibbonControl control)
    {
        switch (control.Id.ToLower())
        {
            case "sklabeltest2":
                if (Globals.ThisAddIn.LabelTest != string.Empty)
                    return Globals.ThisAddIn.LabelTest;
                else
                return "Label Test 2";
            default:
                return "Label Test 1";
        }
    }

这是通过SkLabelTest1按钮改变SkLabelTest2的文本,然后使控件无效来强制ribbon重新加载它:

    public void SkLabelTest1(Office.IRibbonControl control)
    {
        Globals.ThisAddIn._labelTest = "Changed text";
        Globals.ThisAddIn._ribbon.InvalidateControl("SkLabelTest2");
    }

我已经测试了,以防万一,它改变了文本。希望对大家有所帮助

由于我的名声,我不能发表评论。作为对Charlie帖子的评论,这是一个完美的解决方案,但在我这边,我必须改变一个部分。

我将public void SklabelTest1函数更改为下面的函数:

public void SkLabelTest1(Office.IRibbonControl control)
{
    Globals.ThisAddIn._labelTest = "Changed text";
    this.ribbon.InvalidateControl("SkLabelTest2");
}

并且在我的ribbon类的开始也添加了这个

private Office.IRibbonUI ribbon;

最新更新