【问题标题】:Toggle button in Office 2019 ribbonOffice 2019 功能区中的切换按钮
【发布时间】:2020-12-01 20:56:06
【问题描述】:

我正在尝试在 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 的实例。所以它不允许我首先使回调无效或使用回调。我通过在loadRibbon Sub 中添加MsgBox("Loaded") 来验证这一点。据我了解,Word 文档一打开就会出现一个消息框。

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

【问题讨论】:

    标签: xml vba ms-word ribbon


    【解决方案1】:

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

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

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

    Function GetPressed(control As IRibbonControl) As Boolean
    

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

    【讨论】:

    • 啊,这让我更进一步,但它仍然无法正常工作。我添加了InvalidateControl 方法,并认为我理解“buttonPressed”的含义(调整了上面的代码)。但是,我在 VBA 而不是 VB 中工作,所以在我的情况下,它确实是一个例程而不是一个函数,请参阅link。还有什么建议吗?
    【解决方案2】:

    我终于找到了问题所在,现在已经全部启动并运行了。由于其他人可能会遇到同样的问题,我解释一下我做了什么。

    使用其他人编写的扩展名自定义功能区的一种简单方法是转到文件 > 选项 > 自定义功能区,然后从右下角的“导入/导出”下拉框中选择“导入自定义文件”。这将在 %localAppData%\Microsoft\Office 中创建一个名为“Word.officeUI”的文件。

    我认为将我自己的 xml 代码直接写入此文件是个好主意。它可以工作......只要您不想动态更新功能区。由于功能区的初始版本不需要动态更新,所以绝对没问题。出于这个原因,我也没有安装这个Office RibbonX Editor。一旦我使用这个工具实现了我的自定义,问题就解决了(以及许多其他创建的,但都是可以解决的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2012-09-26
      相关资源
      最近更新 更多