2010-12-04 6 views
0

Ich habe Probleme damit, dass mein Timer den Inhalt eines Fensters ändert.Wie verwende ich einen Timer, um Inhalt anzuzeigen?

ich initialisieren meine Timer von:

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

ich einen Content haben, die versteckt ist.

Wenn der Timer 15 Sekunden geht sollte es die Sichtbarkeit des Content ändern

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

} 

ich eine Ausnahme bin immer: System.InvalidOperationException

Was mache ich falsch?

Vielen Dank im Voraus!

+0

Was Linie die Ausnahme wirft? –

+0

TicketContent.Visibility = Visibility.Visible; –

Antwort

0

Warum DispatcherTimer nicht

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

timer.Start(); 
+0

Für das dritte Argument, stelle ich einfach meine Methode als meine Rückruffunktion? –

+0

ja - die gleiche Methode wie Sie in Ihrem ursprünglichen Post hatten :) –

+0

Danke nochmal! Übrigens, weißt du, ob es weitergeht und diese Funktion anruft, oder hört es nach einem Anruf auf? –

0

Wenn Sie einen Timer starten, beginnt er auf einem separaten Nicht-UI-Thread. Da es in einem separaten Thread ist, kann es nicht auf Elemente im UI-Thread zugreifen. Ein Delegat in Kombination mit einer Dispatcher.BeginInvoke() -Methode ermöglicht es Ihnen, die Eigenschaften von UI-Elementen zu ändern.

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

Ich kann InvokeDelegate nicht finden, ist das für WPF? –

+0

Ja, die Methode ist in .NET 3.5. –

Verwandte Themen