停止在Timer.Tick上闪烁标签

时间:2018-12-21 19:17:50

标签: c# winforms timer

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

注意:我确实找到了重复的问题,但是在应用该修复程序后,问题仍然存在。 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'");
}

1 个答案:

答案 0 :(得分:1)

由于正如您在评论中所说,图像已分配给您的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功能。在Form构造函数中:
(也是其他控件的有效方法,尤其是Panel类)

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