在Excel 2010中dynamic更改button图像

我正在使用XML创build一个自定义Excelfunction区,其中包含一个包含图像的button。 我希望能够改变这个图像时,按下button(如切换),以显示它是在什么状态。我有以下的XML来描述button:

<button id="MyButton" label="MyLabel" screentip="Some useful info." onAction="MyAction" getImage="GetImage" size="large"/> 

MyAction方法定义如下:

 public void MyAction(Office.IRibbonControl control) { // Change button image here... } 

有什么办法可以改变MyAction()方法中button的图像?

干杯

编辑:对不起,我刚刚意识到这是在C#论坛上,我写了VB中的function。 你需要我把代码翻译成C#吗? 请注意,callback行为应该是相同的。

我发现最简单的方法来更新控件是使控件或整个function区失效,并通过控件的callbackgetImage,getVisible,getLabel等更新参数。我在这里写的将适用于任何控件的参数标签,启用,可见,…)

所以,如果你用这种方式定义你的button:

 <button id="MyButton" label="MyLabel" onAction="OnAction" getImage="GetImage"/> 

然后,您可以使用OnActioncallback以这种方式更新button的参数(假设您有一个名为condition的布尔variables):

 Public Sub OnAction(ByVal control As Office.IRibbonControl) // Do your button stuff here condition = Not condition gui.InvalidateControl(control.Id) End Sub 

然后button的callback将被调用,getImage可以使用:

 Public Function GetImage(ByVal control As Office.IRibbonControl) As String If condition Then Return "MacroPlay" Else Return "DeclineInvitation" End If End Function 

请注意,对于所有这些工作,您需要将Ribbon存储到guivariables中。 为此,您需要在XML中使用:

 <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnRibbonLoad"> ... 

并在代码中:

 Public Sub OnRibbonLoad(ByVal ribbon As Office.IRibbonUI) gui = ribbon End Sub 

这看起来好像你是正确的。 我发现编辑自定义function区元素外观的唯一方法是使用“function区(可视化devise器)”而不是XML。

例如,如果我想更改名为toggleButton1的切换button上的图像,我可以执行以下操作:

 public void toggleButton1_Click(object sender, RibbonControlEventArgs e) { toggleButton1.Image = GetImage(toggleButton1.Checked); } 

GetImage被定义为:

 public Bitmap GetImage(bool pressed) { return new Bitmap(pressed ? Properties.Resources.img_1 : Properties.Resources.img_2); } 

干杯

 <button id="MyButton" label="MyLabel" onAction="OnAction" getImage="GetImage"/> 

上面的解决scheme为我工作。 只要确保在customUI xml节点上不使用loadImage事件。 看起来像是如果您同时使用loadImage和GetImage,则插件无法加载。