Outlook VSTO обрабатывает SelectionChange правильно (в настоящее время двойной щелчок вызывает сбой надстройки) - PullRequest
0 голосов
/ 09 мая 2020

Насколько я понимаю, вам нужно отслеживать активацию и деактивацию проводников. Во время активации вам необходимо добавить обработчики событий SelectionChange для текущего проводника. Кажется, это отлично работает для одиночных щелчков по AppointmentItems. Но при двойном щелчке по серии встреч и выборе одной встречи происходит сбой надстройки.

Вот источник: На уровне класса

    private Outlook.Explorer currentExplorer = null;
    private Outlook.AppointmentItem currentAppointmentItem = null;

в Startup:

       currentExplorer = this.Application.ActiveExplorer();

        ((Outlook.ExplorerEvents_10_Event)currentExplorer).Activate +=
        new Outlook.ExplorerEvents_10_ActivateEventHandler(
        Explorer_Activate);

        currentExplorer.Deactivate += new
        Outlook.ExplorerEvents_10_DeactivateEventHandler(
        Explorer_Deactivate);

Обработчики событий:

    void Explorer_Activate()
    {
        currentExplorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(Selection_Change);
    }

    void Explorer_Deactivate()
    {
        currentExplorer.SelectionChange -= new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(Selection_Change); ;
    }

    private void Close_Explorer()
    {

    }

    private void Selection_Change()
    {
        Outlook.MAPIFolder selectedFolder = currentExplorer.CurrentFolder;            
        if (currentExplorer.Selection.Count > 0)
        {
            Object selObject = currentExplorer.Selection[1];
            if (selObject is Outlook.AppointmentItem)
            {
                currentAppointmentItem = (Outlook.AppointmentItem)selObject;
            }
            else
            {
                currentAppointmentItem = null;
            }
        }
    }

Что я упускаю из виду? Проблема с формой отмены регистрации?

Ответы [ 3 ]

0 голосов
/ 10 мая 2020

Единственное, что я добавил, это обработчик событий NewInspector и InspectorClose вместе с Marshal.ReleaseComObject (). Единственное, что я могу себе представить, это двойной щелчок во время отладки, я попал в какое-то состояние гонки (потому что двойной щелчок также вызывает событие Selection_Change). Но это только предположение.

0 голосов
/ 11 мая 2020

Вам не нужно добавлять и удалять обработчики событий, так как проводник активирован / деактивирован. Вы пытаетесь поддержать нескольких исследователей? В этом случае создайте класс-оболочку, который содержит объект Explorer как член и использует его методы как обработчики событий.

0 голосов
/ 09 мая 2020

Попробуйте добавить в обработчики событий блоки try / catch. Объектная модель Outlook иногда может давать непредсказуемые результаты. Стоит добавить их и найти, где возникает исключение.

currentExplorer.Selection.Count 

Кроме того, вы можете подписаться на событие SelectionChange в событии NewExplorer и не переключаться между проводниками когда они активированы или деактивированы. Событие запускается всякий раз, когда открывается новое окно проводника, либо в результате действия пользователя, либо с помощью программного кода.

...