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



>我有一个自定义的功能区,其中我添加了一个包含切换按钮的选项卡。此切换按钮具有一个 getPressed 属性,该属性链接到返回切换按钮按下状态的回调函数。切换按钮的用途是显示/隐藏自定义任务窗格。这工作正常。

但是,我的问题是,在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 工作簿和窗口 (De)激活事件触发后。

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

以下是关于这个问题的详细讨论: 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 工作正常,但您必须仅在激活时期待回调。

最新更新