1

在我的开发机器上,我之前触发了FormInitializing和事件。我在VS 2010中创建了一个安装包,并安装在安装了Outlook 2010的普通Windows 7 Ultimate上。FormShowingRibbonLoad

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

4

1 回答 1

1

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

ThisAddIn.Startup我在之前触发时注意到了同样的行为ThisAddIn.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
    }
}
于 2013-04-16T16:16:37.577 回答