2010-12-04 4 views
0

J'ai des problèmes avec obtenir mon minuteur pour changer le contenu sur une fenêtre.Comment utiliser une minuterie pour afficher du contenu?

j'initialiser mon timer par:

timeOutTimer = new System.Timers.Timer(15000); 
      timeOutTimer.Elapsed += new ElapsedEventHandler(timeOutEvent); 
      timeOutTimer.Enabled = true; 
      timeOutTimer.AutoReset = false; 
      timeOutTimer.Start(); 

J'ai un ContentControl qui est caché.

Lorsque la minuterie passe 15 secondes, il devrait changer la visibilité du ContentControl

private void timeOutEvent(object sender, ElapsedEventArgs e) 
{ 
    TicketContent.Visibility = Visibility.Visible; 
    Console.WriteLine("TIMED OUT"); 
    timeOutTimer.Stop(); 

} 

Je reçois une exception: System.InvalidOperationException

Qu'est-ce que je fais mal?

Merci d'avance!

+0

Quelle ligne est de lancer l'exception? –

+0

TicketContent.Visibility = Visibilité.Visible; –

Répondre

0

Pourquoi ne pas utiliser DispatcherTimer

timer = new DispatcherTimer(
    TimeSpan.FromSeconds(15), 
    DispatcherPriority.Background, 
    TimeoutEvent, 
    this.Dispatcher); 

timer.Start(); 
+0

Pour le troisième argument, est-ce que je place ma méthode comme fonction de rappel? –

+0

oui - même méthode que vous aviez dans votre message original :) –

+0

Merci encore! Btw, savez-vous si elle continue et continue à appeler cette fonction, ou s'arrête après 1 appel –

0

Lorsque vous démarrez une minuterie, celle-ci commence sur un thread distinct non UI. Comme il se trouve dans un thread séparé, il ne peut pas accéder aux éléments du thread de l'interface utilisateur. Un délégué en combinaison avec une méthode Dispatcher.BeginInvoke() vous permettra de modifier les propriétés des éléments de l'interface utilisateur.

private void timeOutEvent(object sender, ElapsedEventArgs e) 
    { 
     TicketContent.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new InvokeDelegate(TimeOutEvent)); 
     Console.WriteLine("TIMED OUT"); 
     timeOutTimer.Stop(); 
    } 

    public delegate void InvokeDelegate(); 


    private void TimeOutEvent() 
    { 
     TicketContent.Visibility = Visibility.Visible; 
    } 
+0

Je n'arrive pas à trouver InvokeDelegate, est-ce pour WPF? –

+0

Oui, la méthode est dans .NET 3.5. –

Questions connexes