预期时未调用功能区切换按钮getPressed()

本文关键字:按钮 getPressed 功能区 调用 | 更新日期: 2023-09-27 18:22:33

我在outlook2013中为新的电子邮件功能区添加了一个自定义切换按钮。当该按钮被打开时,它会向邮件消息添加一个用户属性。

    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中的"高优先级"切换按钮类似的功能。

预期时未调用功能区切换按钮getPressed()

如本线程所示,当检查器被激活时,您需要一个回调来使功能区无效。无论何时创建新的检查器,都可以添加此事件处理程序。

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();
    }
}