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

时间:2010-04-13 16:07:17

标签: wpf vb.net window refresh

我有两个消息框一个接一个。 Dim msgResult为MessageBoxResult msgResult = MessageBox.Show(“Message”,“Title”,MessageBoxButton.YesNo,MessageBoxImage.Question)

如果mesgResult = MessageBoxresult.Yes然后 '一些代码......     MessageBox.Show(“另一条消息”,“标题”,MessageBoxButton.OK,MessageBoxImage.Error)

如果

结束

当第二个消息框关闭时,用户仍然在同一个窗口上,并且消息框中标题栏的部分仍然可以在Windows文本框的正上方看到。似乎窗口没有得到刷新。怎么办呢? 谢谢。

1 个答案:

答案 0 :(得分:1)

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

  1. 您的UI线程正在执行一些长时间运行的代码而不处理消息
  2. 视频驱动程序中存在错误
  3. 窗口透明度正在使用中,窗口的一部分是透明的,非WPF应用程序负责绘制它
  4. 您正在将WPF与非WPF技术(如GDI(例如MFC),GDI +(例如WinForms)或DirectX)集成,并且绘制有问题的区域应该由其他技术绘制。这包括使用非WPF技术的Frame和MediaPlayer控件。
  5. 解决方案各不相同:

    • 在案例1中,通常在案例4中,问题通常是显而易见的,解决方案通常是修复您的线程问题。如果线程问题不明显,按照Hans Passant的建议打破调试器可能会显示您不知道的长时间运行操作,例如数据库访问。
    • 在案例2中,您可以通过临时切换到软件渲染并通过更新视频驱动程序来修复它来进行诊断。
    • 在案例3中,如果其他应用程序不会重新绘制,则无法执行任何操作,但用户应该认识到这不是您的软件的问题。
    • 如果线程问题不明显,则情况4通常有助于隔离非WPF代码并查看哪些消息处理线程处于活动状态。

    请注意,在UI线程上执行长时间运行操作通常是一个坏主意,如果您需要运行此类操作,您的应用应该是多线程的。但是,如果您的应用程序是快速且脏的,或者您可以完全锁定UI,则可以通过确保在开始长时间运行的操作之前完全刷新Dispatcher队列来解决绘制问题。这是通过以低优先级运行空Dispatcher调用来完成的,从而首先执行所有优先级较高的操作。例如:

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