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。
总而言之,您无法很好地控制停用功能区的状态。但是,如果您只担心活动功能区,Invalidate 可以正常工作,但您必须期望只有在激活时才会回调。
我有一个自定义功能区,我在其中添加了一个包含切换按钮的选项卡。这个切换按钮有一个 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。
总而言之,您无法很好地控制停用功能区的状态。但是,如果您只担心活动功能区,Invalidate 可以正常工作,但您必须期望只有在激活时才会回调。