在我的开发计算机上,FormInitializing
和FormShowing
事件在RibbonLoad
之前触发。我在 VS 2010 中创建了一个安装程序包,并安装在安装了 Outlook 2010 的vanilla Windows 7 Ultimate 上。
插件没有出现在我的会议申请表上。所以我设置了远程调试器,令我惊讶的是RibbonLoad
在上面提到的两个表单事件之前触发了。正在抛出空异常b \ c RibbonLoad
中的代码依赖于已加载的FormRegion
。任何人都可以提供任何见解吗?
答案 0 :(得分: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
}
}