我希望计数器从60秒倒数到0.我希望用户看到UI上的秒数。为了实现这一点,我想我会显示一个基本的TextBlock:
<StackPanel>
<TextBlock Text=" " />
<TextBlock Text=" seconds remaining" />
</StackPanel>
然后我考虑使用Timer。我知道的唯一计时器是DispatcherTimer。但是,这并未显示已经过了多长时间或剩余多少时间。因此,我没有什么可以约束的。
private DispatcherTimer myTimer = new DispatcherTimer();
public MainPage() {
myTimer.Interval = new TimeSpan(0, 0, 60);
myTimer.Tick += new EventHandler(myTimer_Tick);
myTimer.Start();
}
我不知道该怎么做。一位同事告诉我,我甚至不应该这样做,因为它会减慢用户界面的速度。但是用户真的想要它。有人能告诉我:
1)它真的会让UI陷入困境吗? 2)如果没有,我该怎么做?
谢谢!
答案 0 :(得分:3)
是。它会以不可思议的数量减慢速度。坦率地说,担心这件事是绝对荒谬的。
在每个刻度线上,减少一个属性。将UI绑定到该属性。或者,只需在每个刻度上使属性无效,并让属性getter计算剩余时间。
选项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; }
}
答案 1 :(得分:1)
不,它不应该降低用户界面,因为它将每秒开火;关于如何执行此操作的示例可以找到here。
此外,您还可以使用在指定时间范围内运行的Storyboard,并相应地调整UI组件,但我不建议采用这种方法。