vb.net中关闭消息框后的WPF刷新

vb.net中关闭消息框后的WPF刷新,wpf,vb.net,window,refresh,Wpf,Vb.net,Window,Refresh,我有两个消息框,一个接一个。 将msgResult变暗为MessageBoxResult msgResult=MessageBox.Show(“消息”,“标题”,MessageBoxButton.YesNo,MessageBoxImage.Question) 如果mesgResult=MessageBoxresult.Yes,则 “一些代码。。。。。 显示(“另一条消息”,“标题”,MessageBoxButton.OK,MessageBoxImage.Error) 如果结束 当第二个消息框关闭

我有两个消息框,一个接一个。 将msgResult变暗为MessageBoxResult msgResult=MessageBox.Show(“消息”,“标题”,MessageBoxButton.YesNo,MessageBoxImage.Question)

如果mesgResult=MessageBoxresult.Yes,则 “一些代码。。。。。 显示(“另一条消息”,“标题”,MessageBoxButton.OK,MessageBoxImage.Error)

如果结束

当第二个消息框关闭时,用户仍保持在同一窗口上,并且消息框中的标题栏部分仍在windows文本框的正上方可见。窗口似乎没有刷新。如何处理?
谢谢。

这通常不会发生在纯WPF应用程序中。我所看到的情况是:

  • 您的UI线程正在执行一些长时间运行的代码,而不是处理消息
  • 视频驱动程序中有一个bug
  • 窗口透明度正在使用中,窗口的该部分是透明的,非WPF应用程序负责对其进行绘制
  • 您正在将WPF与非WPF技术(如GDI(如MFC)、GDI+(如WinForms)或DirectX)集成,绘制有问题的区域应使用其他技术绘制。这包括框架和MediaPlayer控件,它们在引擎盖下使用非WPF技术
  • 解决方案各不相同:

    • 在案例1和案例4中,问题通常是显而易见的,解决方案通常是修复线程问题。如果线程问题不明显,按照Hans Passant的建议中断调试器可能会发现一个您不知道的长时间运行的操作,例如数据库访问
    • 在案例2中,您可以通过临时切换到软件渲染进行诊断,并通过更新视频驱动程序进行修复
    • 在案例3中,如果另一个应用程序不重新绘制,您将无能为力,但用户应该认识到这不是您的软件的问题
    • 在案例4中,如果线程问题不明显,那么隔离非WPF代码并查看哪些消息处理线程处于活动状态通常是有帮助的
    请注意,在UI线程上执行长时间运行的操作通常是个坏主意,如果您需要运行此类操作,您的应用程序应该是多线程的。但是,如果您的应用程序速度快且脏,或者您完全可以锁定UI,则可以通过确保在开始长时间运行的操作之前完全刷新调度程序队列来解决绘画问题。这是通过以低优先级运行空的调度程序调用来完成的,这会导致首先执行所有高优先级的操作。例如:

    Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {}));
    

    使用Debug+breakall并查看调用堆栈。某些代码正在运行,阻止窗口自行绘制。