【问题标题】:Stop Label from flickering on Timer.Tick停止标签在 Timer.Tick 上闪烁
【发布时间】:2018-12-22 07:54:02
【问题描述】:

我正在制作一个有倒计时的应用程序。
问题是,当在 Timer Tick 上更新其文本时,标签会闪烁。

注意:我确实发现了一个重复的问题,但是在应用该修复程序后问题仍然存在。 Link

提前致谢

DateTime endTime = new DateTime(2018, 12, 21, 13, 0, 0);

private void Form1_Load(object sender, EventArgs e)
{
    t.Interval = 500;
    t.Tick += new EventHandler(t_Tick);
    TimeSpan ts = endTime.Subtract(DateTime.Now);
    countDown.Text = ts.ToString("d' Days 'h' Hours 'm' Minutes 's' Seconds'");
    t.Start();
}

void t_Tick(object sender, EventArgs e)
{
    TimeSpan ts = endTime.Subtract(DateTime.Now);
    countDown.Text = ts.ToString("d' Days 'h' Hours 'm' Minutes 's' Seconds'");
}

【问题讨论】:

  • 将你的骗子的链接添加到你的问题中。
  • 您的代码应该没有问题。你在计时器计时的时候会做一些繁重的计算吗?
  • @SergeyBerezovskiy 目前在应用程序中没有其他任何事情发生,只是时间。但是,我在表单项上确实有一个背景图片,不确定这是否会导致部分问题。
  • 尝试设置Form.DoubleBuffered = true
  • @Jimi 多么了不起的修复!太感谢了。请作为答案提交,我将标记为已解决。

标签: c# winforms timer


【解决方案1】:

正如您在 cmets 中所说,由于您的 Form.BackGroundImage 分配了一个图像,因此更新 UI 可能会导致闪烁。这很正常。
要消除(或显着减少)闪烁,请激活表单的 Double Buffering 功能:

Form.DoubleBuffered = true

来自文档:

缓冲图形可以减少或消除由以下原因引起的闪烁 逐步重绘显示表面的各个部分。缓冲的 图形要求首先将更新的图形数据写入 缓冲。然后将图形缓冲区中的数据快速写入 显示表面记忆。显示的切换比较快 图形内存通常会减少闪烁,否则 发生。

关于这个主题的一些有趣的文件:

Double Buffered Graphics (Windows Forms)
How to: Reduce Graphics Flicker with Double Buffering for Forms and Controls

如果激活双缓冲只能部分消除闪烁,请尝试使用SetStyle 方法修改类的一些位标志,启用这些ControlStyles 功能。在表单构造函数中:
(也是其他控件的有效方法,尤其是 Panel 类)

public Form1()
{
    SetStyle(ControlStyles.AllPaintingInWmPaint | 
             ControlStyles.UserPaint | 
             ControlStyles.OptimizedDoubleBuffer, true);
    this.UpdateStyles();
}

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 2010-12-29
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多