Excel 2013 年多个工作簿的功能区控件无效

Invalidate ribbon control in Excel 2013 for multiple workbooks

我有一个自定义功能区,我在其中添加了一个包含切换按钮的选项卡。这个切换按钮有一个 getPressed 属性,它链接到一个返回切换按钮按下状态的回调函数。切换按钮的用途是 display/hide 自定义任务窗格。这很好用。

但是,我的问题是,在 Excel 2013 年,如果我打开了两个或多个工作簿,当我使切换按钮无效时,只有一个活动工作簿被更新。我还想更新其他工作簿上切换按钮的按下状态,因为自定义任务窗格在所有工作簿中可见或不可见。

有人知道如何在 Excel 2013 中使所有工作簿的功能区中的控件无效吗?

我正在使用 vb.net 和 excel-dna。 切换按钮定义如下:

<toggleButton id="toggleButtonInputData" size="large" onAction="rxToggleButton_onAction" getPressed="rxToggleButton_getPressed" getImage="rxButton_GetImage" getLabel="rxbutton_GetLabel" getEnabled="rxGenericControl_GetEnabled" visible="true"/>

回调函数为:

 Function rxToggleButton_GetPressed(ctl As CustomUI.IRibbonControl) As Object
        Select Case ctl.Id
            Case "toggleButtonInputData"
                Return CTP_InputData.IsToggleButtonPressed
        End Select
    End Function

要使我使用的切换按钮无效:

Public Sub CTP_InputData_VisibleStateChange() Handles CTP_InputData.VisibleStateChange
        XLRibbon.myRibbon.InvalidateControl("toggleButtonInputData")
End Sub

仅针对活动工作簿的功能区处理失效。但是当您随后切换到另一个工作簿时,回调将再次触发,并且现在将应用于新工作簿的功能区。

Excel 2013 中存在与此切换相关的错误和一些怪癖:

如果单击要激活的工作簿的标题栏或功能区,一切都会按预期进行。但是,如果您单击正在激活的工作簿中的一个单元格,您将获得两个回调——第一个应用于停用工作簿的功能区,第二个应用于激活工作簿的功能区。问题是您无法区分(在您的回调中)您是否被要求停用书籍。 (使用 COM 事件也无济于事,两个回调都发生在所有 COM Workbook- 和 Window- (De)Activate 事件都已触发之后。

除了这种古怪的行为外,Excel 2013 中的一个明显错误是 IRibbonControl.Context 未设置为正确的 window - 在两个回调中它反映了激活window,尽管第一个回调将应用于停用 window。

这里有关于这个问题的详细讨论:https://social.msdn.microsoft.com/Forums/windowsserver/en-US/a3dade87-1df7-46ec-8876-437194d7553e/how-to-reference-the-correct-workbook-from-a-control-in-a-ribbon-callback?forum=exceldev

总而言之,您无法很好地控制停用功能区的状态。但是,如果您只担心活动功能区,Invalidate 可以正常工作,但您必须期望只有在激活时才会回调。