首页 > 解决方案 > VSTO 4/XML:如何使某些控件可选地可见

问题描述

我有一个由 VSTO-4 和 VS2017 制作的 XML 功能区,在 Outlook-2016 中运行。我使用的不是 Visual Studio 提供的设计器,而是整个“流利”模式(XML)。

如果这个功能区配有按钮,我的客户会因为同一个功能区中有这么多按钮/选项而“有点”迷失......而且它们中的大多数实际上只是我程序的“选项”。

我想用 3 个按钮制作这个 Ribbon(现在命名为 Ribbon-1),其中一个是“OPTIONS”命令按钮,来调用 Ribbon-2,这个按钮充满了我现在在 Ribbon 中拥有的所有其他按钮- 1.

显然,Ribbon-2 将出现在 Ribbon-1 的同一个 TAB 中(至少“出现在同一个 TAB 中”),一旦用户设置一个选项,他点击“BACK”按钮,Ribbon-2 消失,Ribbon -1 再次出现...

我们可以在一些插件中看到这种行为,我也想做同样的事情。

有什么建议吗?我很感激任何提示。

标签: visual-studio-2017vstooffice-interopribbonx

解决方案


与其使用多个功能区,不如将所有控件放在一个功能区中。使用该getVisible属性来设置应选择隐藏或可见的所有按钮和组的可见性。使用 atoggleButton显示/隐藏这些按钮。

onAction回调可以设置回调可以检查toggleButton的类级变量。getVisible然后该过程使功能区无效,以便getVisible触发回调。这些依次检查类级变量以确定每个按钮的可见性状态。

请注意,get当功能区加载时也会执行回调。

示例功能区 XML:

<group id="MyGroup" label="TEST empty" visible="true">
  <button id="testButton" label="test empty" visible="true"/>
  <toggleButton id="testToggle" label="toggle optional buttons" visible="true" onAction="toggleVisibleControls"/>
  <button id="optionalButton" label ="optional" getVisible="isVisible" />
</group>
<group id="Optional" label="Optional group" getVisible="isVisible"></group>

VSTO 功能区 XML 的示例 VB.NET 代码:

'Generated by VSTO
<Runtime.InteropServices.ComVisible(True)> _
    Public Class Ribbon1
    Implements Office.IRibbonExtensibility

    Private ribbon As Office.IRibbonUI
    Private ShowHide As Boolean = False

    Public Sub New()
    End Sub

    Public Function GetCustomUI(ByVal ribbonID As String) As String Implements Office.IRibbonExtensibility.GetCustomUI
        Return GetResourceText("VB2010addin_RibbonXML.Ribbon1.xml")
    End Function

#Region "Ribbon Callbacks"
    'Create callback methods here. For more information about adding callback methods, select the Ribbon XML item in Solution Explorer and then press F1.
    Public Sub Ribbon_Load(ByVal ribbonUI As Office.IRibbonUI)
        Me.ribbon = ribbonUI
     End Sub

    Public Function isVisible(ByVal control As Office.IRibbonControl) As Boolean
        Return Me.ShowHide
    End Function

    Public Sub toggleVisibleControls(ByVal control As Office.IRibbonControl, pressed As Boolean)
        ShowHide = pressed
        ribbon.Invalidate()
    End Sub

#End Region

推荐阅读