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

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

К сожалению, я не смог найти ничего, что могло бы помочь мне в этом. Я безуспешно пытался использовать надстройку загрузки приложений Office 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).

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


person SimperT    schedule 20.03.2018    source источник


Ответы (1)


Я придумал решение.

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

Поэтому я отменил метод CreateRibbonExtensibilityObject.

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

    return base.CreateRibbonExtensibilityObject( );
}

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

Кроме того, CreateRibbonExtensibilityObject() возвращает объект с GetCustomUI( ribbonXml ), поэтому мы можем создать нашу пользовательскую ленту из xml. Это дает нам больше сил.

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

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

person SimperT    schedule 20.03.2018