Показать или скрыть ленту надстройки VSTO

Моя цель - просто предложить свой плагин, если приложение Office запускается с определенным аргументом.

К сожалению, я не мог найти ничего, чтобы помочь мне сделать это. Я пытался использовать Office Add Load Swtich /lc:Addin.dll без успеха. Один из вариантов, который мне понравился, заключался в создании всех записей реестра надстроек Office при желании запустить надстройку, однако это выглядело крайне неуклюже и приводило к большим накладным расходам. Кроме того, нарушитель соглашения для меня требовал создания реестра с повышенными правами для инициализации надстройки.

Я решил, что мой плагин ничего не делает при запуске, если не существует определенной переменной среды.

Чтобы сделать это таким образом, мне нужно либо установить ленту на невидимую по умолчанию и показать ленту при обнаружении переменной env. Или наоборот: лента по умолчанию видна и скрывает ленту при обнаружении переменной env.

Вещи, которые я пробовал

  • Настройка вкладки ленты Globals.Ribbons.MyRibbon.MyTab.visible = false,
  • Аннулирование ленты Globals.Ribbons.MyRibbon.RibbbonUi.Invalidate(),
  • Отмена признания вкладки после установки видимой в false Globals.Ribbons.MyRibbon.RibbbonUi.InvalidateControl(tabCtrlId),

Попытки не включают в себя десятки вещей, которые пытаются загружать надстройки только при определенных обстоятельствах.

2 ответа

Я нашел решение.

после копания в базовом классе AddinBase Я обнаружил некоторые методы, доступные для переопределения.

Поэтому я перевесил CreateRibbonExtensibilityObject метод.

protected override IRibbonExtensibility CreateRibbonExtensibilityObject( )
{
    if( Environment.GetCommandLineArgs( ).ToList( ).FirstOrDefault( a => a.ToLower( ).Contains( "/launchmyaddin" ) ) != null )
    {
        return null;
    }

    return base.CreateRibbonExtensibilityObject( );
}

Это предотвращает создание ленты, даже если мой переключатель присутствует, и если он присутствует, тогда я просто перехожу к реализации базового класса, чтобы Addin создал мою ленту как обычно.

Также, CreateRibbonExtensibilityObject() возвращает объект, который имеет GetCustomUI( ribbonXml ) так что мы можем создать нашу собственную ленту из XML. Это дает нам больше силы.

Моему решению нужно было показать / скрыть ленту только один раз при запуске. Я действительно думал о том, как это можно включать и выключать, поэтому я искал других членов, которых мог переопределить.

Я считаю, что вы можете переопределить CreateRibbonObjects( ) член, который, я думаю, будет вызываться каждый раз, когда вызывается аннулирование ленты. Здесь вы можете удалить элемент из коллекции, возвращаемой базовым классом, который представляет вашу ленту, которую вы хотите скрыть.

Если вы используете настраиваемые вкладки (это ControlIdType=Custom), вы можете установить видимость с помощью:

      foreach (var tab in Globals.Ribbons.Ribbon1.Tabs)
{
   tab.Visible = false;
}
Другие вопросы по тегам