我一直在寻找解决方案,而最接近的解决方案是Ron de Bruin example,但它并没有涵盖我需要的东西。
我想做的事实上是两件事
示例:我有4个按钮。
Group1和tab1上的Button1
Group1和tab1上的Button2
Group2和tab2上的Button3
Group2和tab2上的Button4
当单击功能区控件“Button1”时,它将运行一些代码并在结尾处禁用“Button1”。
当单击功能区控件“Button2”时,它将运行一些代码并检查“Button3”和“button4”并设置相反的属性。
如果button3为true,则变为false。
如果button4为false,则变为true。
您能否提供一些解决此问题的指导
答案 0 :(得分:4)
好的,所有按钮都有GetEnabled
个事件,所以当功能区激活/更新时 - 事件被触发! (简单)。
此事件的回调函数如下所示:
Sub Button_GetEnabled(control As IRibbonControl, ByRef enabled)
'(enabled = true to enable)
enabled = EnableButtons
End Sub
让我们开始吧!在具有回调函数的模块中,您需要一个全局(全局到回调)布尔值smth,如EnableButtons
。
当功能区加载时,此代码示例将设置标志触发到True
:
Private Sub OnRib_Load(ribbonUI As IRibbonUI)
Set MyRibbonUI = ribbonUI
EnableButtons = True
End Sub
在每个按钮上,您需要回复上述GetEnabled
事件。
之后 - 所有按钮都启用了!那么我们可以在这做什么呢?让我们看看OnAction回调到你想要的按钮:
Sub Button_Click(control As IRibbonControl)
EnableButtons = False
MyRibbonUI.Invalidate
'do some stuff - buttons disabled
EnableButtons = True
MyRibbonUI.Invalidate
End Sub
所以Invalidate
方法“更新”所有控件。您可以尝试InvalidateControl
所需的控件(由于性能,这是一种比Invalidate
更优选的方式),但我认为更优雅的方法是仅在您想要的按钮上放置回调和事件!
因此,最后,您需要引用功能区,布尔标志和_GetEnabled
事件。
答案 1 :(得分:2)
Commonsense提供的解释帮助我为所提出的修订问题建立最终解决方案。感谢
Option Explicit
Public MyRibbonUI As IRibbonUI
Public EnableButton1 As Boolean
Public EnableButton2 As Boolean
Public EnableButton3 As Boolean
Public EnableButton4 As Boolean
Public Sub OnRib_Load(ribbon As IRibbonUI)
'
' Code for onLoad callback. Ribbon control customUI
'
Set MyRibbonUI = ribbon
EnableButton1 = True
EnableButton2 = True
EnableButton3 = True
EnableButton4 = False
End Sub
Public Sub Button_GetEnabled(control As IRibbonControl, ByRef Enabled)
'
' Code for getEnabled callback. Ribbon control button
'
Select Case control.ID
Case "Button1"
Enabled = EnableButton1
Case "Button2"
Enabled = EnableButton2
Case "Button3"
Enabled = EnableButton3
Case "Button4"
Enabled = EnableButton4
End Select
End Sub
Public Sub Button1_onAction(control As IRibbonControl)
'
' Code for onAction callback. Ribbon control button
'
EnableButton1 = False
MyRibbonUI.InvalidateControl ("Button1")
End Sub
Public Sub Button2_onAction(control As IRibbonControl)
'
' Code for onAction callback. Ribbon control button
'
If EnableButton3 = False Then
EnableButton3 = True
Else
EnableButton3 = False
End If
MyRibbonUI.InvalidateControl ("Button3")
If EnableButton4 = False Then
EnableButton4 = True
Else
EnableButton4 = False
End If
MyRibbonUI.InvalidateControl ("Button4")
End Sub
Public Sub Button3_onAction(control As IRibbonControl)
'
' Code for onAction callback. Ribbon control button
'
End Sub
Public Sub Button4_onAction(control As IRibbonControl)
'
' Code for onAction callback. Ribbon control button
'
End Sub