2010-12-02 5 views
2

Je veux avoir un compteur qui décompte de 60 secondes à 0. Je veux que l'utilisateur voit le nombre de secondes sur l'interface utilisateur. Pour cela, je pensais que j'afficherait un TextBlock de base comme par exemple:Créer un compte à rebours dans Silverlight

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

Je puis pensais à l'aide d'une minuterie. La seule minuterie que je connaisse est le DispatcherTimer. Cependant, cela ne montre pas combien de temps s'est écoulé ou combien de temps il reste. Pour cette raison, je n'ai rien à lier.

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

Je ne sais pas comment faire cela. Un collègue m'a dit que je ne devrais même pas faire cela parce que ça va ralentir l'IU. Mais les utilisateurs le veulent vraiment. Quelqu'un peut-il me dire:

1) Est-ce que ça va vraiment nuire à l'interface utilisateur? 2) Si non, comment je fais ça?

Merci!

Répondre

3
  1. Oui. Il va le ralentir d'un montant imperceptible. Franchement, il serait absolument ridicule d'être inquiet à ce sujet.

  2. À chaque tick, décrémentez une propriété. Liez votre interface utilisateur à cette propriété. Sinon, il suffit d'invalider une propriété à chaque tick et de faire en sorte que la propriété getter calcule le temps restant.

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

Non, il ne devrait pas enliser l'interface vers le bas puisqu'il sera mise à feu chaque seconde; échantillon sur la façon de le faire peut être trouvé here.

En outre, vous pouvez également utiliser un Storyboard qui fonctionne pour votre période de temps spécifiée et ajuste un composant de l'interface utilisateur en conséquence, mais je ne recommanderais pas cette approche.