繁体   English   中英

在Silverlight中创建一个倒数计时器

[英]Create a Countdown Timer in Silverlight

我希望有一个从60秒倒数到0的计数器。我希望用户在UI上看到秒数。 为此,我想我将显示一个基本的TextBlock,如下所示:

<StackPanel>
  <TextBlock Text=" " />
  <TextBlock Text=" seconds remaining" />
</StackPanel>

然后,我开始考虑使用计时器。 我唯一知道的计时器是DispatcherTimer。 但是,这并不表示已经过去了多少时间或剩余了多少时间。 因此,我没有什么可绑定的。

private DispatcherTimer myTimer = new DispatcherTimer();    
public MainPage() {
  myTimer.Interval = new TimeSpan(0, 0, 60);
  myTimer.Tick += new EventHandler(myTimer_Tick);
  myTimer.Start();
}

我不确定该怎么做。 一位同事告诉我,我什至不应该这样做,因为这会减慢UI的速度。 但是用户确实想要它。 有人可以告诉我:

1)它真的会使UI陷入困境吗? 2)如果没有,我该怎么做?

谢谢!

  1. 是。 它将减慢不可思议的数量。 坦白说,担心这一点绝对是荒谬的。

  2. 在每个刻度上,递减一个属性。 将您的用户界面绑定到该属性。 另外,只需在每个刻度上使属性无效,然后让属性获取器计算剩余时间。

选项1

myTimer.Interval = TimeSpan.FromSeconds(1);
myTimer.Tick += delegate
{
    this.SecondsRemaining = this.SecondsRemaining - 1;

    if (this.SecondsRemaining == 0)
    {
        myTimer.Dispose();
    }
};
this.SecondsRemaining = 60;
myTimer.Start();

...

// assumes your class implements INotifyPropertyChanged and you have a helper method to raise OnPropertyChanged
public int SecondsRemaining
{
    get { return this.secondsRemaining; }
    private set
    {
        this.secondsRemaining = value;
        this.OnPropertyChanged(() => this.SecondsRemaining);
    }
}

选项2

myTimer.Interval = TimeSpan.FromSeconds(1);
myTimer.Tick += delegate
{
    this.OnPropertyChanged("TimeRemaining");

    if (this.TimeRemaining <= 0)
    {
        myTimer.Dispose();
    }
};
this.endTime = DateTime.UtcNow.AddMinutes(1);
myTimer.Start();

public int TimeRemaining
{
    get { return (endTime - DateTime.UtcNow).TotalSeconds; }
}

不,它不应该让UI停顿下来,因为它将每秒触发一次。 有关如何执行此操作的示例,请参见此处

此外,您还可以使用在指定时间范围内运行的情节提要板,并相应地调整UI组件,但是我不建议您采用这种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM