RibbonControl属性回调(getPressed,getSupertip等)永远不会更新

时间:2013-08-01 17:09:37

标签: c# excel callback ribbon excel-addins

虽然可以直接设置某些office功能区控件属性(例如Label),但大多数都使用回调来设置属性。例如按钮的图像:

<button id="btnRecalculate" getImage="GetRibbonControlImage" label="Recalculate Now"  onAction="OnButtonAction" size="normal" />

文档非常清楚这些回调的语法,但不是关于它们被调用的时间和频率。

我现在面临的问题是,当以编程方式更改值时,我想修改功能区上的某个属性(例如按钮上的工具提示)。我有一个为supertip定义的回调,如:

<button id="btnSetServerURL" getSupertip="GetSuperTip" label="Set Server URL" />

代码隐藏:

public string GetSuperTip(IRibbonControl control)
{
    switch( control.Id )
    {
        case "btnSetServerURL":
            return "Click to set the server URL. (Currently: " + API.URL + ")";
        default:
            return "";
    }
}

当更改该URL时,下次用户将鼠标悬停在该按钮上时,我希望调用GetSuperTip回调并显示正确的当前URL的消息,但此时该值刚刚被设置为第一次,再也不会了。

有没有办法让我寻求的行为?这是一个Excel加载项,因此据我所知,WPF样式绑定不是一个选项。

1 个答案:

答案 0 :(得分:4)

正如您所发现的,Excel会缓存功能区控件的状态。执行您想要执行的操作的唯一方法是每次进行影响它们的状态更改时使功能区/控件无效。因此,在您的情况下,只要API.URL发生更改,您就需要手动使功能区或控件无效。

1)在onLoad XML中包含customUI属性。

<customUI ... onLoad="OnRibbonLoad" ...>
    ...
</customUI>

2)在回调中,存储功能区界面:

private IRibbonUI _ribbon;

public void OnRibbonLoad(IRibbonUI ribbon)
{
    _ribbon = ribbon;
}

3)稍后,如果状态更改影响功能区,则使功能区或其控件无效:

    ...
    _ribbon.Invalidate();
    // or //
    _ribbon.InvalidateControl("YourControlID");
    ...