Enable/Disable MS Word 中的自定义功能区命令

Enable/Disable custom ribbon commands in MS Word

我在 MS Word 中制作了一个功能区,其中包含与各种按钮关联的自定义宏,以自动执行检查过程。作为此检查过程的一部分,它需要先交给 A,B 才能在上面签字。

为了更加严格,我想禁用功能区中的“人员 B 签核”按钮,直到人员 A 完成为止,同时禁用其他各种带有条件触发器的按钮。我已经研究了多种途径,但没有什么能接近处理我发现的文章,我想我需要编辑 XML 但我不确定是什么以及如何。

例如 - 在 LLC 实际填写评论之前,检索 LLC 将显示为灰色

非常感谢任何指点或帮助!

/////////////////编辑//////////////////////

澄清一下,上面的按钮是使用 VBA 中编写的宏添加的,并使用自定义功能区工具添加到选项卡、组和单个按钮中。

我现在的理解是我包含以下 XML 代码来调用包含 getEnabled 函数的回调,希望我已经对它进行了排序。我 运行 现在遇到的错误是查找我添加的按钮的唯一 ID,因为它们不是使用 XML 创建的,即不会引用上面突出显示的检索 LLC作为 'button id="Retrieve LLC"'

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="MyAddinIntialize">
    <ribbon startFromScratch= "false">
        <tabs>
            <tab id="Checking">
                <group id="GovernanceProgress">
                    <button id="RetrieveLLC" getEnabled="btnCheck1_getEnabled" />
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>

一方面,您必须编辑 XML - 例如

 <button id ="btnLLCA" onAction="btnLLCA_onAction" 
                       getEnabled="btnLLCA_getEnabled"
                       getVisible="btnLLCA_getVisible"
                       />

getEnabledgetVisible 是您要查找的关键字。 等号后的文本是 vba-code 中的子名称 - 就像 onAction

然后在 VBA-Code:

中创建相应的 Subs
'Callback for btnLLCA_getEnabled
Sub btnLLCA_getEnabled(control As IRibbonControl, ByRef returnedVal)
    returnedVal = hasPersonAReviewed   -->adjust to your needs
End Sub

'Callback for btnLLCA_getVisible
Sub btnLLCA_getVisible(control As IRibbonControl, ByRef returnedVal)
    returnedVal = hasProcessStarted  --> adjust to your needs
End Sub

所以 - 你必须做的:return returnedVal 根据你的进程状态。

一般情况下,您可以使用 COM add-ins 中的回调过程自定义功能区 UI。对于 add-in 实现的每个回调,都会缓存响应。

例如,如果 add-in 编写器实现了按钮的 getEnabled 回调过程,该函数被调用一次,状态为 returned,然后如果启用状态需要更新,缓存的值被使用而不是召回过程。此过程一直保持到 add-in 使用 Invalidate 方法发出缓存值无效的信号,此时再次调用回调过程并缓存 return 响应。 add-in 然后可以通过从 VSTO add-ins 调用 Refresh 方法强制立即更新 UI。但是对于 VBA 宏,您可以使用 IRibbonUI 接口的 InvalidateInvalidateControl 方法。要获取 IRibbonUI 接口的实例,您需要在功能区 XML:

中定义 onLoad 回调
<customUI … OnLoad="MyAddinInitialize" …>

你 VBA 宏可能看起来像这样:

Dim MyRibbon As IRibbonUI 
 
Sub MyAddInInitialize(Ribbon As IRibbonUI) 
 Set MyRibbon = Ribbon 
End Sub 
 
Sub myFunction() 
 MyRibbon.Invalidate() ' Invalidates the caches of all of this add-in's controls 
End Sub

您需要在功能区 XML 标记中使用 getEnebled 回调才能使控件的状态(启用或未启用)无效。 getEnabled 回调的签名如下所示:

Sub GetEnabled(control As IRibbonControl, ByRef enabled)

您可以在以下系列文章中找到深入描述的 Fluent UI(又名 Ribbon UI):