在.net中显示模态对话框时出现小的闪烁

本文关键字:闪烁 对话框 net 显示 模态 | 更新日期: 2023-09-27 18:06:56

我在。net Windows Forms应用程序中遇到了一个令人讨厌的问题。

我有一个MainForm (a)和一个progress form (B),当我开始一个长操作时显示模态。

当操作完成,B被关闭时,似乎我的应用程序后面的窗口(通常发生在Skype上)在几毫秒内被带到前面,然后我的应用程序被正常激活。

只是一个小小的闪烁,但是很烦人。这里我写了一些建议,可以帮助找到解决方案:

  • 我调用showDialog没有IWin32Window,但是我添加它没有成功的结果。
  • 我使用Close()关闭了B,然后我尝试了Hide()Close(),但没有帮助。
  • 执行ShowDialog()的代码是从UI线程调用的,所以它似乎不是一个线程问题。

任何线索将不胜感激。提前感谢。

在.net中显示模态对话框时出现小的闪烁

我也经历过同样的症状,简直要把我逼疯了。

我终于发现问题是,我正在调用this.Dispose()而不是this.Close()来关闭模态窗口,我不确定为什么我首先调用this.Dispose()

转换方法后,问题消失了。

我意识到这个线程是旧的,这不是你的问题的原因,我只是想帮助其他人谁犯了同样的错误,我做了。

检查是否没有调用Hide或Close。避免闪烁的唯一方法是使用对话sult。乌利希期刊指南:this.DialogResult = DialogResult.Ok

检查处理程序OnFormClosing等。它们可能包含错误的方法调用。

小技巧是显式地设置Owner
_dialog.Owner = this;
_dialog.ShowDialog();

编辑文章的人 - _dialog.ShowDialog(this)的工作方式有点不同。查看反编译代码中的owner = ((Control) owner).TopLevelControlInternal;

编辑:

还是……

_dialog.ShowDialog(this);

这些调用是相同的根据MSDN

  1. 不要为模态窗口调用Close(它不会被处理并且内存泄漏是有保证的)

  2. Set this.DialogResult = DialogResult.OK

  3. 从父类调用Dispose(),永远不要从正在关闭的表单调用

  4. 请记住在Dispose(bool)中处置由IContainer形式持有的所有组件(VS Designer实现Dispose(bool)通常不足以避免内存泄漏)

在我的情况下,我也面临着同样的问题在我的VB。Net winform应用程序,但有点不同的场景。我有一个用户控件,它打开一个对话框使用showdialog()说dialog1,并填写一些数据,它隐藏dialog1,并再次使用showdialog()打开dialog2。

在隐藏dialog1和显示dialog2的过程中,出现了闪烁,它在背景中显示了一会儿窗口。

在尝试了这么多的解决方案和变通方法后,没有一个适合我。我自己找到了一个可能对别人有帮助的方法。

要隐藏对话框1,我使用我的隐藏(),解决方案是改变窗体的不透明度,而不是调用隐藏()方法。

' Me.Hide ()

我。不透明度= 0

在这个解决方案之后,应用程序可以正常工作,没有任何闪烁问题。

PS:以上代码行是用VB编写的。但是对于。Net winform应用程序开发人员来说,已经足够了解如何解决这个问题了。

听起来像

  1. 在主窗口中,用户开始一个长操作
  2. 显示进度模式窗口
  3. 操作完成,关闭进度窗口
  4. 你的主窗口没有立即显示。相反,它背后的东西会在一秒钟或更短的时间内显示出来。
  5. 你的主窗口完成了它的重绘操作,并且是100%可见的。
  6. 当你运行Skype等应用程序时,这种情况更常见。

如果是这样的话,那么可能有很多不同的原因。例如,你的视频驱动程序可能有一个bug,在某些条件下导致屏幕外合成延迟。

此时系统本身甚至可能正在经历阻塞CPU操作。这可能是由于代码关闭对话框并返回主表单所花费的时间造成的。你可以看看在进度关闭和你将UI控制返回给用户之间是否还有其他事情你正在做。

系统可能只是内存受限,而您的操作会导致大量的磁盘交换。当操作完成时,可能会通知windows需要从磁盘中取出之前交换的内存并将其塞回RAM,从而导致延迟。


我会运行应用程序Nothing else加载,但任务管理器或资源监视器,看看会发生什么。如果问题不再发生,那么考虑为您的机器添加更多的RAM和/或忽略它。

如果它仍然发生,并且您的内存使用量几乎没有剩余,那么,再次添加RAM或忽略。

如果它仍然发生,但是内存使用率很低,调查你的代码,看看你在关闭对话框和释放主窗口的控制权之间做了什么。

您可以尝试使用以下示例对表单进行双重缓冲:

趋向于消除屏幕更新时的闪烁