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

时间:2015-02-03 16:02:54

标签: vb.net ribbon excel-2013 excel-dna

我有一个自定义功能区,我添加了一个包含切换按钮的选项卡。此切换按钮具有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

1 个答案:

答案 0 :(得分:1)

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

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

如果单击标题栏或要激活的工作簿的功能区,则一切都按预期工作。但是,如果单击工作簿中要激活的单元格,则会收到两个回调 - 第一个应用于停用工作簿的功能区,第二个应用于激活工作簿的功能区。问题是你无法区分(在你的回调中)你是否被要求停用书。 (使用COM事件也没有帮助,两个回调都发生在所有COM Workbook-和Window-(De)Activate事件被触发后。

除了这种古怪的行为之外,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可以正常工作,但只有在激活时才能进行回调。