2010-12-02 6 views
2

Ich möchte einen Zähler haben, der von 60 Sekunden auf 0 zählt. Ich möchte, dass der Benutzer die Anzahl der Sekunden auf der Benutzeroberfläche sieht. Um dies zu erreichen, dachte ich, ich würde eine grundlegende TextBlock- wie solche Anzeige:Erstellen eines Countdown-Timers in Silverlight

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

ich dann dachte, einen Timer verwendet wird. Der einzige Timer, den ich kenne, ist der DispatcherTimer. Dies zeigt jedoch nicht, wie viel Zeit verstrichen ist oder wie viel Zeit noch verbleibt. Aus diesem Grund habe ich nichts zu binden.

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

Ich bin mir nicht sicher, wie das geht. Ein Kollege sagte mir, dass ich das nicht tun sollte, weil es die Benutzeroberfläche verlangsamen würde. Aber die Benutzer wollen es wirklich. Kann mir jemand sagen:

1) Wird es wirklich die UI so sehr bombardieren? 2) Wenn nicht, wie mache ich das?

Danke!

Antwort

3
  1. Ja. Es wird um eine unübersehbare Menge verlangsamen. Ehrlich gesagt, wäre es absolut lächerlich, darüber besorgt zu sein.

  2. Bei jedem Tick eine Eigenschaft dekrementieren. Binden Sie Ihre Benutzeroberfläche an diese Eigenschaft. Alternativ können Sie einfach eine Eigenschaft bei jedem Tick ungültig machen und die verbleibende Zeit von der Eigenschaft getter berechnen lassen.

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

Option 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

Nein, es nicht das UI Moor sollte nach unten, da wird es jede Sekunde Brennen werden; Probe auf, wie man dies tut, kann here gefunden werden.

Zusätzlich könnten Sie auch ein Storyboard verwenden, das für den von Ihnen angegebenen Zeitraum läuft und eine UI-Komponente entsprechend anpasst. Allerdings würde ich diesen Ansatz nicht empfehlen.

Verwandte Themen