我正在制作一个具有倒数计时的应用程序。
问题是,在计时器上更新标签的文本时,标签会闪烁。
注意:我确实找到了重复的问题,但是在应用该修复程序后,问题仍然存在。 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'");
}
答案 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();
}