Outlook Addin事件触发不一致

时间:2013-04-16 02:19:54

标签: outlook vsto office-interop outlook-addin outlook-2010

在我的开发计算机上,FormInitializingFormShowing事件在RibbonLoad之前触发。我在 VS 2010 中创建了一个安装程序包,并安装在安装了 Outlook 2010 的vanilla Windows 7 Ultimate 上。

插件没有出现在我的会议申请表上。所以我设置了远程调试器,令我惊讶的是RibbonLoad在上面提到的两个表单事件之前触发了。正在抛出空异常b \ c RibbonLoad中的代码依赖于已加载的FormRegion。任何人都可以提供任何见解吗?

1 个答案:

答案 0 :(得分:1)

某些Outlook事件没有已定义的顺序 - 功能区UI 检查器UI 是完全不同的组件,尽管它们都显示在同一窗口中。 Outlook运行时可能会以不同的顺序触发Ribbon和Inspector事件。如果您需要进行一些初始化,那么同步两个事件( RibbonLoadFormInitializing )将是您的工作。你不能假设订单总是一样的。

ThisAddIn.StartupThisAddIn.CreateRibbonExtensibilityObject之前触发时会发现同样的行为,但有时候依赖于Outlook触发排序的方式。您可以使用具有同步锁定的静态变量,以确保只触发初始化代码一次。

以下是我用于将Startup事件与RibbonLoad事件同步的示例:

public partial class ThisAddIn
{
  static bool formInitialized = false;
  static readonly object padLock = new Object(); 

   private void ThisAddIn_Startup(object sender, System.EventArgs e)
   {
       lock(padLock) { if (!formInitialized ) { InitializeForm(); } }
       // startup code
    }

   private void InitializeForm() 
   {
      // init code
      formInitialized = true;
   }

   protected override IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
        lock(padLock) { if (!formInitialized) InitializeForm(); }
        // Create ribbon UI
    }
}