【问题标题】:Make changes to buttons and labels in an XML Ribbon during run-time在运行时更改 XML 功能区中的按钮和标签
【发布时间】:2018-01-29 16:59:12
【问题描述】:

我知道 * 上已经有几个主题,但没有什么能真正解决问题。这里是: 由于 Ribbon Designer 存在一些固有问题,我决定使用 XML Ribbon 构建我的下一个 Excel 插件。 但是,有时我需要根据用户选择对功能区中的控件进行更改。例如,我需要更改标签的文本,并在某些情况下禁用某些控件。这就是我撞到砖墙的地方。似乎没有办法做到这一点。我尝试将逻辑放在 onAction 回调中,如下所示:

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

但是这个转换不起作用,因为显然 IRibbonControl 接口与 LabelConrol 继承的 RibbonControl 类无关。 我也找不到任何其他方式来访问任何 XML 功能区控件。甚至有解决方案吗?还是我应该坚持使用 Ribbon Designer?

【问题讨论】:

    标签: visual-studio vsto ms-office


    【解决方案1】:

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

    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 的文本然后使控件无效以强制功能区重新加载它:

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

    我已经测试了以防万一,它可以更改文本。希望这会有所帮助

    【讨论】:

      【解决方案2】:

      由于我的声誉,我无法发表评论。作为对Charlie's post 的评论,这是一个完美的解决方案,但就我而言,我不得不改变一个部分。

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

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

      并且还在我的功能区类的开头添加了这个。

      private Office.IRibbonUI ribbon;
      

      希望对你有帮助。

      【讨论】:

        最近更新 更多