我正在使用VSTO开发Outlook AddIn。我通过XML管理功能区选项卡和上下文菜单,现在我只想在Outlook的“邮件”或“联系人”选项卡处于活动状态时显示我的自定义选项卡。
我已经尝试使用IdMso来解决它,这对我来说不是一个解决方案,因为它只会扩展内置选项卡(因此会执行上下文选项卡)。
进一步的研究没有为我提供任何解决方案或任何方法。
当我更改Outlook标签(例如从邮件到日历)时,是否有任何机会触发任何回调或事件,以便我可以通过我想要的代码设置可见性?如果没有,那么另一种方法是什么?
提前致谢。
EDIT1:
与此同时,我想出了如何仅在资源管理器中显示自定义功能区:
public string GetCustomUI(string ribbonID)
{
if(ribbonID == "Microsoft.Outlook.Explorer")
return GetResourceText("Ribbon.xml");
return String.Empty;
}
Edit2(解决方案):
所以我终于让它工作了,不像我想象的那样,但解决方案是可以接受的。
public void Ribbon_Load(Office.IRibbonUI ribbonUI)
{
this.ribbon = ribbonUI;
Globals.ThisAddIn.Application.ActiveExplorer().NavigationPane.ModuleSwitch += NavigationPane_ModuleSwitch;
Globals.ThisAddIn.Application.Explorers.NewExplorer += Explorers_NewExplorer;
}
private void Explorers_NewExplorer(Outlook.Explorer Explorer)
{
Explorer.NavigationPane.ModuleSwitch += NavigationPane_ModuleSwitch;
}
private void NavigationPane_ModuleSwitch(Outlook.NavigationModule CurrentModule)
{
ribbon.Invalidate();
}
public bool EnableButton(Office.IRibbonControl ribbonControl)
{
Outlook.OlNavigationModuleType currentModuleType = Globals.ThisAddIn.Application.ActiveExplorer().NavigationPane.CurrentModule.NavigationModuleType;
if (currentModuleType == Outlook.OlNavigationModuleType.olModuleContacts || currentModuleType == Outlook.OlNavigationModuleType.olModuleMail)
{
return true;
}
return false;
}
虚拟按钮的XML:
<button id="btnDummy" label="Click Me" onAction="TestFunc" size="large" getImage="GetDummyImage" getEnabled="EnableButton"/>
因此,每个资源管理器都可以访问它的导航窗格,并且此窗格有一个名为“ModuleSwitch”的事件(当您切换模块时它会触发,例如从联系人发送到Mail),然后我使功能区无效。在每次失效时,会调用几个函数,如“getEnabled”函数。在给定的getEnabled函数中,我正在检查哪个模块当前处于活动状态并返回所需的值。