VSTO Word 激活功能区选项卡

本文关键字:选项 功能区 激活 Word VSTO | 更新日期: 2023-09-27 17:56:45

我有以下功能区.xml在我的单词vsto加载项中:

<tab id="TabLetters" getVisible="IsLettersTabVisible" label="Letters">
 <group id="LettersGroup" label="Letters">
  <toggleButton id="NewWithTemplate"
              label="New using template Controls"
              size="large"
              imageMso="FileNew"
              onAction="NewTemplated" />
  </toggleButton>
 </group>
</tab>

以及点击事件背后的以下代码:

public void NewTemplated(Office.IRibbonControl control, bool value)
{
  CloseDocument();
  var doc = Globals.ThisAddIn.Application.Documents.Add(Template: @"LETTER_V2.dotx", Visible: true);
  doc.Activate();
  _ribbon.ActivateTab("TabLetters");
}

我本来希望这会导致一个新窗口打开我的功能区选项卡,但它只是保持可见/当前的 HOME 选项卡。 如何使我的选项卡是可见的选项卡?

VSTO Word 激活功能区选项卡

您可以通过以下两种方式设置活动选项卡:

TabLetters.RibbonUI.ActivateTab("TabLetters");

Globals.Ribbons.CustomRibbon.Tabs[Your tab id].RibbonUI.ActivateTab("TabLetters");

我找到了 excel 2007 的解决方案。

法典:

int appVersion = Convert.ToInt32(Globals.ThisAddIn.Application.Version.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries)[0]);
if (appVersion >= 14 )            
{
    ThisRibbonCollection ribb = Globals.Ribbons;
    ribb.[Your Ribbon].ApplicationGroup.RibbonUI.ActivateTab("tab");                
}
else if(appVersion == 12)  // Specific to Office 2007 only.
{
                SendKeys.Send("%TAB%"); // use sendwait if you running it in thread.
}

在 Excel 2013 中,以下是我需要使用的代码:

try
{
    //  Attempt to set the my VSTO ribbon bar as the active ribbon.
    string controlID = Globals.Ribbons.GetRibbon<MikesRibbon>().MikesTab.ControlId.ToString();
    this.RibbonUI.ActivateTab(controlID);
}
catch
{
}

我偶然发现的一点是如何让 ControlID 传递给 ActivateTab 函数。

您需要在VS2013中打开MikesRibbon.cs文件(或等效文件! 它将显示功能区的外观,功能区的选项卡名称旁边有一个灰色的FILE选项卡。

在此设计器屏幕中,单击功能区的选项卡(即FILE右侧的选项卡),"属性"窗口现在将显示一个ControlID值,您可以将其设置为您选择的值。

只适合所有必须支持Office 2007的人(像我一样)。下面是 Office 2007 的一个(丑陋但有效的)解决方案:

  1. 打开办公应用程序
  2. 按 Alt,然后查看自定义功能区选项卡的键盘快捷方式
  3. 在您的代码中,您现在可以通过 SendKeys.SendWait 函数发送此密钥

希望它对某人有所帮助。问候,约尔格


法典:

    public void FocusMyCustomRibbonTab()
    {
        if (IsExcel2007())
        {
            Globals.Ribbons.GetRibbon<MyRibbon>().tabMyRibbonTab.KeyTip = "GGG";
            //Excel 2007: Must send "ALT" key combination to activate tab, here "GGG"
            SendKeys.Send("%");                       
            SendKeys.Send("{G}");                     
            SendKeys.Send("{G}");                     
            SendKeys.Send("{G}");                     
            SendKeys.Send("%");                       
        }
        else
        {
            //Excel 2010 or higher: Build in way to activate tab
            if (this.ribbon.RibbonUI != null)
            {
                this.ribbon.RibbonUI.ActivateTab("MY_RIBBON_TAB_NAME");
            }
        }
    }
    public static bool IsExcel2007()
    {
        return (Globals.ThisAddIn.Application.Version.StartsWith("12"));
    }

在 Word 2016 中使用 RibbonUI.ActivateTabMso(controlID) 激活常规 Word 功能区选项卡。

此外,您可以通过添加加载项来获取对功能区的正确引用:

static internal Microsoft.Office.Tools.Ribbon.OfficeRibbon rUI = null;

private void WorkBenchRibbon_Load(object sender, Microsoft.Office.Tools.Ribbon.RibbonUIEventArgs e)
    {
        rUI = ((Microsoft.Office.Tools.Ribbon.OfficeRibbon)sender).Ribbon;
    }

如果您来这里寻找解决方案,因为您已经从 Application.DocumentOpen 事件处理程序或一些类似事件中尝试了上述任何操作,但不断收到错误,您可能会遇到此障碍。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/baa9a81d-aad3-4af5-9d0a-f945c26ffa18/activiating-a-ribbon-tab-for-vsto-for-a-workbook-solutions-when-a-workbook-is-loaded-net-4?forum=vsto

简短且不那么甜蜜的答案是您无法激活选项卡,直到...后。。。通过使用计时器并响应已用事件。 只是希望节省一些人的时间。