c# - Outlook 加载项 : RibbonToggleButton Image changes only refreshes when outlook window becomes active

标签 c# outlook outlook-addin synchronizationcontext

有什么方法可以在 outlook 加载项中强制刷新或重绘控件?我基本上是在更新功能区中按钮的图像。该图像是通过 WebApi 调用在服务器中生成的,该调用包含新记录计数和新图像。这似乎工作正常,除非 outlook 窗口不是事件/聚焦窗口。

当我的加载项收到来自服务器的 SignalR 通知时,将执行以下代码段。该代码段调用 webapi 以获取包含按钮新图像的新信息。

我不确定自己做错了什么,但是当连接了多个屏幕/显示器并且 outlook 处于扩展屏幕(未聚焦)时,它不会使用新图像更新按钮,尽管代码已经被执行了。这些更改仅在我单击/关注 Outlook 时反射(reflect)出来。

BackgroundWorker bw = new BackgroundWorker();    
bw.DoWork += new DoWorkEventHandler(
delegate (object o, DoWorkEventArgs args)
{
    var info = MyServerCallToGetNewCountAndImage();
    if (SynchronizationContext.Current != null)
        {
        var uiContext = SynchronizationContext.Current;
        uiContext.Post(b =>
            {
            MyInfo i = (MyInfo)b;
            // Update ribbon button image.
            myButton.Image = i.Image;
            }, info);
        }
});

bw.RunWorkerAsync();

最佳答案

您需要调用IRibbonUI.Invalidate。当您处理插件功能区的 onLoad 回调时,IRibbonUI 接口(interface)会传递给您的插件。

关于c# - Outlook 加载项 : RibbonToggleButton Image changes only refreshes when outlook window becomes active,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51740443/

相关文章:

HTML 电子邮件签名未在 Outlook 2016 中呈现,知道为什么吗?

Html 电子邮件对齐文本和图像

vba - 使用 Excel VBA 选择 Outlook 文件夹

c# - 如何从 Outlook 功能区上下文菜单中获取当前邮件项目

outlook - 什么是 outlook 2013 中弃用的 ItemContextMenuDisplay 的等价物

c# - 如何知道任务是否同步完成?

c# - 在asp.net c#中按下按钮后如何更改div的cssclass?

c# - NHibernate 按代码映射和 IUsertype 不工作

c# - Foreach 首先调用 Enumerator 中的 MoveNext,然后调用 Current

outlook-addin - Outlook(桌面)插件 : Reasons for null Office. context.mailbox.userProfile.emailAddress?