使标签显示和消失的计时器非常缓慢且无响应

时间:2015-12-26 03:01:41

标签: c# .net winforms visual-studio

我想这样做,以便在单击表单时,标签会显示x毫秒。然后就消失了。

顺便说一下,我尝试将timer1.Enabled=true替换为timer1.Start(),将timer1.Enabled=false替换为timer1.Stop(),但这没有任何区别。

这是我的代码。我有一个表单,我已经以编程方式创建了一个标签,我已经添加到表单上,并且我已经以编程方式创建了一个计时器。间隔设置为300毫秒(我可能会减少它,但现在,300毫秒)。

这个想法是标签以。Visible=false开头,然后当单击表单时,标签应该可见300毫秒,然后变为不可见。我尝试通过说第一次定时器运行来实现这一点,即在启用后,使标签可见,第二次使标签不可见。

我管理即使不需要计算计时器运行的次数,我通过简单地说如果标签不可见(必须是计时器刚刚启用时第一次运行)来管理它,那么让它可见,如果标签是可见的(即它必须是计时器第二次运行),则使其不可见并禁用计时器。

问题是,由于反应迟钝和反应迟钝,它没有反应。我点击了,我有一个MouseDown的事件,但是它与标签出现之间存在延迟。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication16
{
    public partial class Form1 : Form
    {

        Label label1;
        Timer timer1;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            timer1 = new Timer();
            timer1.Interval = 300;
            timer1.Tick += timer1_Tick;

            label1 = new Label();
            label1.Text = "blah";
            label1.Visible = false;
            this.Controls.Add(label1);            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            if (label1.Visible == false) { label1.Visible = true;  } 
            else { label1.Visible = false; timer1.Enabled = false; }

        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            timer1.Enabled = true;
        }

    }
}

1 个答案:

答案 0 :(得分:0)

原因是在启用计时器后,它不会立即运行tick方法。如果你使间隔更长,就像3000毫秒那么你会清楚地看到这一点。因此,鉴于这一事实,解决方案就是这样。

    private void timer1_Tick(object sender, EventArgs e)
    {
        label1.Visible = false;
        timer1.Enabled = false;
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        label1.Visible = true;
        timer1.Enabled = true; //will wait timer1.interval milliseconds then run tick           
    }