C# Outlook加载项:RibbonToggleButton图像更改仅在Outlook窗口处于活动状态时刷新

C# Outlook加载项:RibbonToggleButton图像更改仅在Outlook窗口处于活动状态时刷新,c#,outlook,outlook-addin,synchronizationcontext,C#,Outlook,Outlook Addin,Synchronizationcontext,有没有办法强制在outlook加载项中刷新或重画控件的UI?我基本上是在更新功能区中按钮的图像。该映像通过WebApi调用在服务器中生成,该调用包含一个新映像的新记录计数。除非outlook窗口不是活动/聚焦窗口,否则这似乎工作正常 当我的外接程序从服务器收到信号器通知时,将执行下面的代码段。该代码段调用webapi以获取包含按钮新图像的新信息 我不确定我做错了什么,但是当连接了多个屏幕/监视器并且outlook位于扩展屏幕(未聚焦)中时,它不会用新图像更新按钮,尽管代码已经执行。这些更改仅在我

有没有办法强制在outlook加载项中刷新或重画控件的UI?我基本上是在更新功能区中按钮的图像。该映像通过WebApi调用在服务器中生成,该调用包含一个新映像的新记录计数。除非outlook窗口不是活动/聚焦窗口,否则这似乎工作正常

当我的外接程序从服务器收到信号器通知时,将执行下面的代码段。该代码段调用webapi以获取包含按钮新图像的新信息

我不确定我做错了什么,但是当连接了多个屏幕/监视器并且outlook位于扩展屏幕(未聚焦)中时,它不会用新图像更新按钮,尽管代码已经执行。这些更改仅在我单击/关注outlook时反映

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
<代码>IRibbonUI接口在您处理加载项功能区的
onLoad
回调时传递给您的加载项。

我取得成功的唯一方法是结合使用
IRibbonUI.Invalidate
使功能区无效,然后切换到outlook窗口并返回到以前关注的内容


这对于一次性更新来说应该很好,但如果经常这样做,显然会干扰应用程序。

是的,p尝试过,但仍然存在相同的问题。在更改生效之前,您仍然必须单击outlook以集中精力。其中一个微软论坛说,“只要为主线程获取一个同步上下文,在UI激活并且线程中的窗口消息泵已启动之前,该上下文将不可用。”但我希望有一个人们已经做过的解决方法。如果Outlook窗口中的功能区处于并保持活动状态,它会得到更新吗?是的。这只是outlook不是焦点窗口时的一个问题。你看到@Stepu了吗?是的,我看到并预订了那个。但我还没试过。我希望有人能用丝带解决这个问题。我建议通常在你看到其他人也有同样问题的地方添加一条评论。也许他现在有了另一个解决方案,但他没有把这个写进去。。。