Несогласованное срабатывание события надстройки Outlook

На моей машине разработки события FormInitializing и FormShowing запускаются до RibbonLoad. Я создал установочный пакет в VS 2010 и установил его на обычную Windows 7 Ultimate с установленным Outlook 2010.

Надстройка не отображалась в моей форме приглашения на собрание. Итак, я настраиваю удаленный отладчик и, к моему удивлению, RibbonLoad запускается перед двумя упомянутыми выше событиями формы. Выдается нулевое исключение b \ c код в RibbonLoad полагается на уже загруженный FormRegion. Кто-нибудь может предложить какое-нибудь понимание?


person jive137    schedule 16.04.2013    source источник


Ответы (1)


Для определенных событий Outlook нет определенного порядка - пользовательский интерфейс ленты и пользовательский интерфейс инспектора - это совершенно разные компоненты, несмотря на то, что они оба отображаются в одном окне. Среда выполнения Outlook может запускать события ленты и инспектора в разном порядке. Ваша задача - синхронизировать два события (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
    }
}
person SliverNinja - MSFT    schedule 16.04.2013
comment
Спасибо @SilverNinja Это именно то, что я сделал. По крайней мере, мое решение теперь проверено. :) - person jive137; 16.04.2013