在Excel 2010中动态更改按钮图像

时间:2012-10-24 05:10:16

标签: excel c#-4.0 office-interop

我正在使用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()方法中更改按钮的图像吗?

干杯

3 个答案:

答案 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无法加载。