2010-12-02 69 views
2

我想要一個計數器從60秒倒計時到0.我希望用戶看到用戶界面上的秒數。要做到這一點,我想我會顯示一個像這樣的基本TextBlock:在Silverlight中創建一個倒數計時器

<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(); 
} 

我不知道該怎麼做。一位同事告訴我,我甚至不應該這樣做,因爲它會減慢用戶界面。但用戶真的很想要它。有人可以告訴我:

1)它會真的讓用戶界面變得非常糟糕嗎? 2)如果不是,我該怎麼做?

謝謝!

回答

3
  1. 是的。它會以不可思議的量減緩它。坦率地說,擔心這件事絕對荒謬。

  2. 在每個滴答聲上,遞減一個屬性。將您的用戶界面綁定到該屬性。或者,只需使每個滴答的屬性無效,並讓屬性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

不,它不應該陷入困境的UI下來,因爲它會被解僱每秒;關於如何做到這一點的樣本可以找到here

此外,您還可以使用一個Storyboard,它可以在您指定的時間範圍內運行並相應地調整UI組件,但我不會推薦這種方法。

相關問題