Кнопка переключения ленты 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;
}
Это все работает просто отлично.
Проблема возникает, когда:
- Откройте новое почтовое сообщение
- Включить кнопку переключения
- Отменить почтовое сообщение
- Откройте новое почтовое сообщение
На этом этапе кнопка переключения выглядит так, как будто она включена для нового почтового сообщения, даже если для этого сообщения не установлено свойство пользователя.
В отладчике я вижу, что 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();
}
}