在启用桌面合成时,在隐藏表单时更新表单
本文关键字:表单 更新 隐藏 启用 桌面 | 更新日期: 2023-09-27 18:16:44
我试图改变我的表单外观时,它是隐藏的。然后让它可见。
private void HideLabelAndShowForm()
{
label1.Hide();
Invalidate(true);
Update();
// thinking we now have no label on the form?
Show();
// no! the label is still visible!
// and gets hidden after a moment
}
为什么只有在之前的内容(带有可见标签)显示一会儿之后才重新绘制表单?有解决方案吗?
- 这只发生在桌面合成是启用(我使用Windows 7)。
- 删除Invalidate和Update没有帮助
- 方法从UI线程 调用
- 添加线程。睡眠和应用。DoEvents无处不在没有帮助
- 从单独的线程(使用Invoke)调用延迟后的Show没有帮助
尝试使用Application.DoEvents
,但要小心:
private void HideLabelAndShowForm() {
label1.Hide();
Application.DoEvents();
Show();
}
如果您担心的是旧内容的闪烁,请尝试打开双缓冲。
将这一行放入表单的构造函数中:
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
当窗体隐藏时,窗体的Paint事件不会引发。除非你再次显示它,否则它不会油漆。通常情况下,它的速度会快到你看不见。我想你只是看到了窗口的延迟。您的机器可能无法进行桌面排版。
其他想法:
- 应用程序的后台线程非常繁忙。
- 你的表单在重绘之前正在处理大量消息。
- 你的表单控件太多。 您的计算机正忙于其他进程。你的电脑真的很慢。
尝试:
- 确保CPU处于空闲状态。查看贪婪线程/进程。
- 检查导致表单有无数消息要处理的事情。
- 简化表单,如果它有很多控件。
- 更新图形驱动程序。
myForm.Opacity = 0.0F;
myForm.Show();
myForm.Opacity = 1.0F;