在选择更改邮件项目时启用/禁用Ribbon控件



我正在用c#开发outlook插件。

在<<p> strong> Project1 ,我有一个类,它添加控件如下:
internal class ExplorerRibbonUi : MainRibbonUi
{
public ExplorerRibbonUi(Func<string, string> manifestLoader) :
base(RibbonIds.Explorer, manifestLoader)
{
Controls.Add(new Controls1());
Controls.Add(new Controls2());
}
}

我在Microsoft.Outlook.Explorer.xml文件中添加了Control2。

在<<p> strong> Project2 ,我有一个邮件的选择更改事件。如下所示:
if (objSelectionList != null && objSelectionList.Count == 1 && objSelectionList[1] != null)
{
Outlook.MailItem objMailItem = objSelectionList[1] as Outlook.MailItem;
if (objMailItem != null)
{
if (BrandingsManager.IsBrandingLoaded()
&& (Api.Instance.LicenseManager.IsLicensed()
&& (this.IsMailItemBodySecured(objMailItem) || this.IsMailItemSetForDecryption(objMailItem))
&& this.IsRecipientSupportEncryption(objMailItem)))
{
//ENABLE RIBBON CONTROL
}
else
{
//DISABLE RIBBON CONTROL
}
}
}

我想根据上述条件启用/禁用功能区控制。请注意,这不是VSTO插件。我无法从Project1中获得Project2中的ribbon控件。

您可以仅从创建控件的外接程序更新控件。并且,在拥有外接程序开发人员提供的公共方法之前,您无法访问由其他外接程序创建的控件。考虑使用标准的。net机制(如Remoting)从另一个应用程序调用代码。您还可以考虑在外接程序中实现一个可供其他人使用的公共接口,有关更多信息,请参阅来自其他Office解决方案的VSTO外接程序中的调用代码。

我建议使用功能区回调。注意,您可以通过使用COM外接程序中的回调过程来定制Ribbon UI。对于外接程序实现的每个回调,响应将被缓存。

例如,如果外接程序编写器实现了按钮的getEnabled回调过程,则调用该函数一次,加载状态,然后如果需要更新状态,则使用缓存的状态而不是调用过程。这个过程一直保持在适当的位置,直到外接程序通过使用Invalidate方法发出缓存值无效的信号,此时再次调用回调过程并缓存返回的响应。然后,外接程序可以通过调用Refresh方法强制立即更新UI。

在功能区XML标记中,您需要指定以下回调以获得IRibbonUI接口的实例,该实例允许调用Invalidate或InvalidateControl方法:

<customUI … OnLoad="MyAddinInitialize" …>

回调接受IRibbonUI接口的实例,当需要更新控件的状态时,该实例应该被缓存以供进一步使用。

getEnabled回调应该有以下签名:

C#: bool GetEnabled(IRibbonControl control)
VBA: Sub GetEnabled(control As IRibbonControl, ByRef enabled)
C++: HRESULT GetEnabled([in] IRibbonControl *pControl, [out, retval] VARIANT_BOOL *pvarfEnabled)
Visual Basic: Function GetEnabled(control as IRibbonControl) As Boolean

功能区控件只能由添加它们的插件访问/修改。您需要在插件中包含启用/禁用按钮的逻辑,或者在插件中公开某种API,以便您的第二个项目可以调用-您可以通过覆盖ThisAddin类上的RequestComAddInAutomationService方法来实现这一点(返回的对象必须标记为[ComVisible(true)][ClassInterface(ClassInterfaceType.None)])。然后,您的第二个项目可以使用Application.COMAddins集合来检索您的插件(项目1)COMAddin对象(您可以使用COMAddin.ProgId属性来识别它),并使用COMAddin.Object属性调用RequestComAddInAutomationService方法返回的对象。

最新更新