我正在使用XML创建自定义Excel功能区,其中包含一个包含图像的按钮。我希望能够在按下按钮时更改此图像(如切换)以显示它所处的状态。我有以下XML来描述按钮:
<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()
方法中更改按钮的图像吗?
干杯
答案 0 :(得分:3)
编辑:对不起,我刚才意识到这是在C#论坛上,我在VB中编写了这些函数。你需要我把代码翻译成C#吗?请注意,回调行为应该相同。
我发现更新控件的最简单方法是使控件或整个功能区失效,并通过控件的回调更新参数,如getImage,getVisible,getLabel等 我在这里写的内容适用于任何控件的参数(标签,启用,可见,......)
因此,如果您以这种方式在XML中定义按钮:
<button id="MyButton"
label="MyLabel"
onAction="OnAction"
getImage="GetImage"/>
然后,您可以使用OnAction回调以这种方式更新按钮的参数(假设您有一个名为 condition 的布尔变量):
Public Sub OnAction(ByVal control As Office.IRibbonControl)
// Do your button stuff here
condition = Not condition
gui.InvalidateControl(control.Id)
End Sub
然后将调用该按钮的回调,对于getImage,您可以使用:
Public Function GetImage(ByVal control As Office.IRibbonControl) As String
If condition Then
Return "MacroPlay"
Else
Return "DeclineInvitation"
End If
End Function
请注意,要使所有这些工作正常,您需要将功能区存储到 gui 变量中。为此,您需要在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
答案 1 :(得分:0)
看起来你是对的。我发现编辑自定义功能区元素外观的唯一方法是使用“功能区(可视设计器)”而不是XML。
例如,如果我想更改名为toggleButton1
的切换按钮上的图像,我可以执行以下操作:
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);
}
干杯
答案 2 :(得分:0)
<button id="MyButton" label="MyLabel" onAction="OnAction" getImage="GetImage"/>
上面的解决方案对我有用。只需确保在customUI xml节点上不使用loadImage事件。看起来如果同时使用loadImage和GetImage,则addin无法加载。