【问题标题】:WPF refresh after message box closed in vb.net在 vb.net 中关闭消息框后 WPF 刷新
【发布时间】:2011-02-07 12:55:19
【问题描述】:

我有两个消息框一个接一个。 将 msgResult 调暗为 MessageBoxResult msgResult = MessageBox.Show("Message", "Title", MessageBoxButton.YesNo, MessageBoxImage.Question)

如果mesgResult = MessageBoxresult.Yes 那么 '一些代码...... MessageBox.Show("另一条消息", "标题", MessageBoxButton.OK, MessageBoxImage.Error)

如果结束

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

【问题讨论】:

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

标签: wpf vb.net window refresh


【解决方案1】:

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

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

解决方案各不相同:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    相关资源
    最近更新 更多