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

时间:2011-12-05 09:07:25

标签: c# .net winforms paint

我正在尝试在隐藏时更改表单外观。然后让它可见。

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. 删除无效和更新无效
  3. 从UI线程调用方法
  4. 在任何地方添加Thread.Sleep和Application.DoEvents无济于事
  5. 从单独的线程延迟调用Show(使用Invoke)无效

4 个答案:

答案 0 :(得分:0)

尝试使用Application.DoEvents,但be careful

private void HideLabelAndShowForm() {
    label1.Hide();
    Application.DoEvents();
    Show();
}

答案 1 :(得分:0)

如果您关注的是旧内容的闪烁,请尝试启用双缓存。

将此行放在表单的构造函数中:

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);

答案 2 :(得分:0)

隐藏表单时不会引发表单的Paint事件。在你再次Show()它之前它不会绘画。通常它应该是如此之快以至于你看不到它。我认为你只是看到了Windows的延迟。您的机器可能不足以进行桌面组合。

其他想法:

  • 您的应用程序背景非常繁忙。
  • 您的表单在进行重新绘制之前正在处理大量消息。
  • 您的表单控件太多了。
  • 您的计算机非常忙于其他过程。
  • 你的电脑真的很慢。

要尝试的事情:

  • 确保CPU处于空闲状态。寻找贪婪的线程/进程。
  • 检查导致您的表单需要处理大量邮件的内容。
  • 如果表单有很多控件,请简化表单。
  • 更新图形驱动程序。
  • 获得更快的电脑。

答案 3 :(得分:0)

myForm.Opacity = 0.0F;
myForm.Show();
myForm.Opacity = 1.0F;