Обзор
У меня есть надстройка Outlook, созданная с помощью VSTO. Надстройка имеет одну ленту (визуальный конструктор) для типа ленты Mail.Compose
. На вкладке ленты ControlIdType
установлено значение «Пользовательский». Единственный код в надстройке, кроме кода конструктора, - это следующий Load
обработчик ленты. this.Context.CurrentItem
неожиданно возвращает ноль.
Код
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
имеет значение null.
Примечания
- Я тестировал это в Outlook 2007, 2010 и 2013 с надстройкой Outlook 2007 и 2010, созданной в VS2010, и надстройкой Outlook 2010, созданной в VS2012. Все ведут себя одинаково.
- Повторное открытие черновика электронного письма не вызывает проблемы, между ними должен быть открыт Инспектор электронной почты.
- Вкладка ленты
ControlidType
имеет значение. «Custom» вызовет проблему, но вариант «Office» по умолчанию не обнаруживает проблемы. - Переворачивание сценария с ног на голову и установка типа ленты на
Mail.Read
дает тот же результат при условии, что последовательность открытия обратная: «Входящие»> «Черновик»> «Входящие» (сбой). - Все возможные перестановки вызовов
Marshal.ReleaseComObject
на объектахinspector
иcurrentMailItem
не имеют значения.