概述
我有一个使用 VSTO 创建的 Outlook 加载项。Mail.Compose
加载项具有用于功能区类型的单个功能区(视觉设计器) 。功能区选项卡ControlIdType
设置为“自定义”。除了设计器代码外,加载项中的唯一代码是Load
功能区的以下处理程序。this.Context.CurrentItem
意外返回 null。
代码
private void RibbonComposeMail_Load(object sender, RibbonUIEventArgs e)
{
try
{
var inspector = this.Context as Outlook.Inspector;
if (inspector == null)
{
throw new ApplicationException("Fail - Step 1");
}
var currentMailItem = inspector.CurrentItem as Outlook.MailItem;
if (currentMailItem == null)
{
throw new ApplicationException("Fail - Step 2");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
脚步
- 打开草稿电子邮件。色带加载正常。
- 从收件箱打开电子邮件。
- 打开相同的草稿电子邮件。功能区在第 2 步失败,
inspector.CurrentItem
为空。
笔记
- 我在 Outlook 2007、2010 和 2013 中对此进行了测试,在 VS2010 中创建了 Outlook 2007 和 2010 插件,在 VS2012 中创建了 Outlook 2010 插件。所有行为都相同。
- 反复打开电子邮件草稿似乎不会导致问题,必须在两者之间打开一个 Email.Read 检查器。
- 功能区选项卡
ControlidType
很重要。“自定义”会导致问题,但“Office”的默认选项不会出现问题。 Mail.Read
如果将打开的顺序颠倒为收件箱 > 草稿 > 收件箱(失败),则翻转场景并将功能区类型设置为给出相同的结果。Marshal.ReleaseComObject
对inspector
and对象的调用的所有可能排列currentMailItem
都没有区别。