Ms office 显示或隐藏VSTO加载项功能区 我的目标是,如果使用某个参数启动Office应用程序,只需提供我的加载项。

Ms office 显示或隐藏VSTO加载项功能区 我的目标是,如果使用某个参数启动Office应用程序,只需提供我的加载项。,ms-office,vsto,office-interop,ribbon,comaddin,Ms Office,Vsto,Office Interop,Ribbon,Comaddin,不幸的是,我找不到任何东西来帮助我做到这一点。我尝试使用Office应用程序加载插件swtich/lc:Addin.dll,但没有成功。我考虑的一个选择是在希望启动addin时创建所有Office addin注册表项,但是这看起来非常笨拙,而且会带来很大的开销。此外,我的交易破坏者需要注册表创建提升权限才能初始化加载项 我决定让我的插件在启动时不做任何事情,除非存在某个环境变量 为此,我需要在默认情况下将ribbon设置为不可见,并在发现env变量时显示ribbon。或者相反,默认情况下功能区可

不幸的是,我找不到任何东西来帮助我做到这一点。我尝试使用Office应用程序加载插件swtich
/lc:Addin.dll
,但没有成功。我考虑的一个选择是在希望启动addin时创建所有Office addin注册表项,但是这看起来非常笨拙,而且会带来很大的开销。此外,我的交易破坏者需要注册表创建提升权限才能初始化加载项

我决定让我的插件在启动时不做任何事情,除非存在某个环境变量

为此,我需要在默认情况下将ribbon设置为不可见,并在发现env变量时显示ribbon。或者相反,默认情况下功能区可见,并在发现环境变量时隐藏功能区

我尝试过的事情
  • 设置功能区选项卡
    Globals.Ribbons.myibon.MyTab.visible=false
  • 使功能区无效
    Globals.Ribbons.MyRibbon.ribbonui.Invalidate()
  • 设置visible to false后使选项卡无效
    Globals.Ribbons.MyRibbon.ribbonUI.InvalidateControl(TabCtrid)
尝试过的东西不包括在某些情况下仅尝试加载加载项的几十种东西。

我想出了一个解决方案。 在深入研究基类
AddinBase
之后,我发现了一些可以重写的方法

因此我重写了
createRibboneExtensibilityObject
方法。 这样做是为了防止功能区在我的开关存在的情况下被创建,如果它存在,那么我只需要传递到基类实现,以便让加载项像正常一样创建我的功能区

另外,
CreateRibbonExtensibilityObject()
返回一个对象,该对象具有
GetCustomUI(ribbonXml)
,因此我们可以从xml创建自定义功能区。 这给了我们更多的力量

我的解决方案只需要在启动时显示/隐藏功能区一次。我确实考虑过如何打开和关闭它,所以我四处寻找我可以覆盖的其他成员

我相信您可以重写
CreateRibbonObjects()
成员,我认为每次调用ribbon的invalidate时都会调用该成员。在这里,您可以从基类返回的集合中删除表示要隐藏的功能区的项

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

    return base.CreateRibbonExtensibilityObject( );
}