我知道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;