C# - 根据Timer值延迟更新定时器滴答时的UI

时间:2018-01-19 23:02:27

标签: c# wpf timer

我希望我的WPF应用程序在显示图像之前显示3秒倒计时,使用计时器根据经过的三秒钟显示“3,2,1”计数(意味着使用计时器更新UI)等待显示图像,直到三秒钟结束(意味着方法等待)。

在伪代码中,我尝试执行以下操作:

    显示
  • 3,然后一秒钟
  • 显示
  • 2,然后一秒钟
  • 显示
  • 1,然后一秒钟
  • 显示图像

我正在尝试使用System.Timers.Timer,例如:

...

public int Countdown = 3;

...

private void UpdateCountdown(object source, EventArgs e) 
{
    Countdown--;
}

public void DoStuff()
{
    Timer timer = new Timer();
    timer.Interval = 1000;
    timer.Elapsed += UpdateCountdown;
    timer.Start();

    while (Countdown > 0)
    {
        // do not act until the 3 seconds have elapsed
    }

    // now that 3 seconds have elapsed...
    ShowImage();
}

在我的xaml中,我将Countdown值绑定到TextBlock:

<TextBlock Name="TbCountdown" Text="{Binding Path=Countdown}"/>

我尝试了一些不同的东西,例如尝试Dispatcher.Invoke。我的问题是以下两件事之一总是发生:

  1. 用户界面被屏蔽,并且未显示3转为2,等等。
  2. UI正确显示3,2,1但ShowImage()方法不等待3秒,它只是立即发生。
  3. 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

不要忙于调整Countdown中的DoStuff值,而是将测试和ShowImage()放在UpdateCountdown处理程序中。

private void UpdateCountdown(object source, EventArgs e) 
{
    if (--Countdown == 0)
        ShowImage();
}

public void DoStuff()
{
    Timer timer = new Timer();
    timer.Interval = 1000;
    timer.Elapsed += UpdateCountdown;
    timer.Start();    
}