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"
/>
getEnabled
和 getVisible
是您要查找的关键字。
等号后的文本是 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
接口的 Invalidate
或 InvalidateControl
方法。要获取 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):
我在 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"
/>
getEnabled
和 getVisible
是您要查找的关键字。
等号后的文本是 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
接口的 Invalidate
或 InvalidateControl
方法。要获取 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):