Кнопка переключения ленты getPressed() не вызывается, когда ожидается

Я добавил пользовательскую кнопку переключения на новую ленту электронной почты в outlook 2013. Когда кнопка включена, она добавляет свойство пользователя к почтовому сообщению.

    public void OnLockButton(Office.IRibbonControl control, bool pressed)
    {
        Outlook.MailItem mi = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem as Outlook.MailItem;
        var userProp = mi.UserProperties.Add("MyIsLocked", Outlook.OlUserPropertyType.olYesNo, false);
        userProp.Value = pressed;

        // Make sure we update the ribbon
        ribbon.Invalidate();
    }

Состояние 'toggle' кнопки обновляется обратным вызовом getPressed(), который проверяет состояние пользовательского свойства:

    public bool GetLockButtonPressed(Office.IRibbonControl control)
    {
        Outlook.MailItem mailItem = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem as Outlook.MailItem;
        var userProp = mailItem.UserProperties.Find("NMIsLocked");

        bool isLocked = (userProp != null && userProp.Value);

        return isLocked;
    }

Это все работает просто отлично.

Проблема возникает, когда:

  1. Откройте новое почтовое сообщение
  2. Включить кнопку переключения
  3. Отменить почтовое сообщение
  4. Откройте новое почтовое сообщение

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

В отладчике я вижу, что getPressed() не вызывается для нового сообщения, поэтому я думаю, что состояние кнопки ленты точно такое же, как и в прошлый раз, когда оно было нарисовано.

Некоторые идеи, которые у меня были, включают в себя принудительное отключение ленты при открытии (или закрытии) почтового сообщения. Или есть какой-то другой способ, который я пропустил?

Я ищу аналогичную функциональность кнопке "Высокий приоритет" в Outlook.

1 ответ

Решение

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

public class MyRibbon: Office.IRibbonExtensibility
{
    private Office.IRibbonUI ribbon;

    public void Ribbon_Load(Office.IRibbonUI ribbonUI)
    {
        this.ribbon = ribbonUI;
        // ensure that any new inspectors created have a callback to refresh the button state on ativation.
        Globals.ThisAddIn.Application.Inspectors.NewInspector += Inspectors_NewInspector;
    }

    void Inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        ((Outlook.InspectorEvents_10_Event)Inspector).Activate += Inspector_Activate;
    }

    void Inspector_Activate()
    {
        ribbon.Invalidate();
    }
}
Другие вопросы по тегам