【问题标题】:Inconsistent Outlook Addin Event Firing不一致的 Outlook 插件事件触发
【发布时间】:2013-04-08 07:20:52
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    对于某些 Outlook 事件没有定义的顺序 - 功能区 UIInspector 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
        }
    }
    

    【讨论】:

    • 谢谢@SilverNinja 这正是我所做的。至少我的解决方案现在已经得到验证。 :)
    猜你喜欢
    • 2015-09-03
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多