在启用桌面合成时,在隐藏表单时更新表单

本文关键字:表单 更新 隐藏 启用 桌面 | 更新日期: 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
}

为什么只有在之前的内容(带有可见标签)显示一会儿之后才重新绘制表单?有解决方案吗?

  1. 这只发生在桌面合成是启用(我使用Windows 7)。
  2. 删除Invalidate和Update没有帮助
  3. 方法从UI线程
  4. 调用
  5. 添加线程。睡眠和应用。DoEvents无处不在没有帮助
  6. 从单独的线程(使用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;