如何在标签上显示特定时间(如3秒)的文本?

时间:2012-02-23 13:30:50

标签: c# time label

我有一个状态栏标签,我想在StatusBar标签上显示一段文字仅3秒

如何在不使用线程的情况下执行此操作?

public void InfoLabel(string value)
    {
        if (InvokeRequired)
        {
            this.Invoke(new Action<string>(InfoLabel), new object[] { value });
            return;
        }
        infoLabel.Text = value;
    }

4 个答案:

答案 0 :(得分:6)

只需在方法的末尾添加计时器:

if (!string.IsNullOrWhiteSpace(value))
{
  System.Timers.Timer timer = new System.Timers.Timer(3000) { Enabled = true };
  timer.Elapsed += (sender, args) =>
    {
       this.InfoLabel(string.Empty);
       timer.Dispose();
    };
 }

答案 1 :(得分:3)

你需要定义一个你每次需要显示文本时调用的函数,在这个函数中定义一个定时器,这个定时器基于System.Windows.Forms.Timer,唯一的区别是它被修改为持有一个表示运行持续时间的stopTime参数,您唯一需要做的就是将您的起始代码(显示文本)放在MyFunction函数中,并将结束代码(停止显示文本)放在里面Timer_Tick函数,一旦调用MyFunction,只需指定在函数参数中运行多少秒。

 private void MyFunction(int durationInSeconds)
    {
        MyTimer timer = new MyTimer();
        timer.Tick += new EventHandler(Timer_Tick); 
        timer.Interval = (1000) * (1);  // Timer will tick every second, you can change it if you want
        timer.Enabled = true;
        timer.stopTime = System.DateTime.Now.AddSeconds(durationInSeconds);
        timer.Start();
        //put your starting code here
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        MyTimer timer = (MyTimer)sender;
        if (System.DateTime.Now >= timer.stopTime)
        {
            timer.Stop();
            //put your ending code here
        }
    }

修改后的计时器类

public class MyTimer : System.Windows.Forms.Timer
{
    public System.DateTime stopTime;
    public MyTimer()
    {

    }
}

答案 2 :(得分:1)

您可以使用Timer创建一个计时器实例,在触发n事件之前等待Elapsed秒。在已用完的事件中,您清除了标签Content

由于计时器是在一个单独的线程中执行的,因此在计时器计数时不会锁定UI线程,即您可以在UI中自由执行其他操作。

private delegate void NoArgDelegate();

private void StartTimer(int durationInSeconds)
{
    const int milliSecondsPerSecond = 1000;
    var timer = new Timer(durationInSeconds * milliSecondsPerSecond);
    timer.Start();
    timer.Elapsed += timer_Elapsed;
}

private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    var clearLabelTextDelegate = new NoArgDelegate(ClearLabelText);
    this.Dispatcher.BeginInvoke(clearLabelTextDelegate);
}

private void ClearLabelText()
{
    this.myLabel.Content = string.Empty;
}

由于我没有其他代码,因此一些建议是在计时器上创建一个锁,以防止启动计时器的多个UI事件。此外,委托和计时器实例可以作为类的private成员。

答案 3 :(得分:0)

您将始终至少使用GUI线程。如果您决定在该线程上等待,则不可能与控件进行其他交互(即,没有按钮可以工作,窗口将不会重新绘制)。

或者,您可以使用System.Windows.Forms.Timer将控制权交还给操作系统或其他类型的计时器。无论哪种方式,“倒计时”将阻止用户交互或发生在另一个线程上(在引擎盖下)。