首页 > 解决方案 > Office 2019 功能区中的切换按钮

问题描述

我正在尝试在 Word 2019 功能区中获取切换按钮。

我在 Stack Overflow 上查看了很多示例,但我没有让它运行。

我的 XML 看起来像:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="loadRibbon">
    <ribbon>
        <tabs>
            <tab id="doc_management" label="Publishing" insertBeforeQ="TabDeveloper">
                <group id="doc_drafting" label="Drafting" autoScale="true">
                    <toggleButton id="toggling" label="Insert Watermark" imageMso="WatermarkGallery" onAction="togglingWatermark" getPressed="buttonPressed"/>
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>

对应的VBA代码:

Option Explicit
Public myRibbon As IRibbonUI
Public isPressed As Boolean
    
Sub loadRibbon(ribbon As IRibbonUI)
    
    Set myRibbon = ribbon
    
End Sub
    
Sub togglingWatermark(control As IRibbonControl, pressed As Boolean)
    
    Select Case control.ID
        isPressed = pressed
        Case "toggling"
            If isPressed Then
                MsgBox isPressed
            Else
                MsgBox isPressed
            End If
    End Select
    
    myRibbon.InvalidateControl control.ID
    
End Sub

Sub buttonPressed(control As IRibbonControl, ByRef returnedVal)
    
    Select Case control.ID
        Case "toggling"
            returnedVal = isPressed
    End Select
    
End Sub

存在带有相应按钮的自定义选项卡。我也可以切换按钮。但我希望在切换后立即看到一个弹出屏幕。这并没有发生。我错过了什么?任何帮助将不胜感激!

编辑:

似乎没有加载 IRibbonUI 的实例。所以它不允许我首先使回调无效或使用回调。我通过添加Sub验证MsgBox("Loaded")了这一点。loadRibbon据我了解,一旦打开 Word 文档,就会出现一个消息框。

VBA 代码保存在启用宏的 Word 模板中,并存储在 %appData%\Microsoft\Word\STARTUP 中。添加一个从同一模板调用 Sub 的普通按钮正在工作。

标签: xmlvbams-wordribbon

解决方案


getPressedOffice 使 Fluent UI 控件无效并允许您指定是否按下切换按钮控件时调用回调。要调用回调,您需要使用IRibbonUI.InvalidateControl方法,该方法使功能区用户界面上单个控件的缓存值无效。

您可以使用 COM 加载项中的回调过程自定义功能区 UI。对于加载项实现的每个回调,响应都会被缓存。例如,如果外接程序编写器实现getImage了按钮的回调过程,则调用该函数一次,加载图像,然后如果需要更新图像,则使用缓存的图像而不是调用该过程。对于控件,此过程保持在原地,直到加载项通过使用该InvalidateControl方法发出缓存值无效的信号,此时,再次调用回调过程并缓存返回响应。

此外,getPressed回调的签名如下所示:

Function GetPressed(control As IRibbonControl) As Boolean

它返回一个布尔值,指示按下状态。它不是像这样的事件处理程序onAction


推荐阅读