none
DispatcherTimer.Tick - Event lässt sich nicht handlen RRS feed

  • Frage

  •  

    Mein Problem wäre vermutlich im C#-Forum besser aufgehoben. Da ich das Codebeispiel aber dem Buch Entwickeln für Windows Phone 7 entnommen habe, in welches ziemlich viele hier im Forum gerade vertieft sein dürften, poste ich es lieber hier.

    Ich muss auch dazu sagen, dass ich ein ziemlicher Neuling bin und den Fehler wahrscheinlich selbst zu verschulden habe.

    Hier erst einmal der Code, so wie er in der MainPage.xaml.cs steht. Die beiden Blöcke folgen direkt auf den Konstruktor der Klasse MainPage . Eingebunden habe ich den Namespace System.Windows.Threading , welcher laut msdn Library die Klasse DispatcherTimer definiert.

    void LayoutRoot_Loaded (object sender, RoutedEventArgs e)
     {
    	DispatcherTimer timer = new DispatcherTimer();
    	timer.Interval = new TimeSpan (0,0,1);
    	timer.Tick += new EventHandler (timer_Tick);
    	timer.Start();
     }
    
     void timer_Tick (object sender, RoutedEventArgs e)
     {
    	if (progressBar1.Value <= timer.Maximum)
     	{
    	progressBar1.Value++;
    	} 
     }

    Ich habe den Code mehrmals mit dem Beispiel aus dem Buch verglichen und konnte keinen Unterschied (abgesehen von den unterschiedlichen Bezeichnern) ausmachen.

    Folgende zwei Fehlermeldungen werden angezeigt:

    1. in Bezug auf die Zeile:

    Timer.Tick  +=  new EventHandler (timer_Tick);

    "Keine Überladung für "timer_Tick" stimmt mit dem Delegaten System.EventHandler überein."

    So wie ich das verstehe bedeutet das, dass EventHandler ein zweiter Parameter - nämlich für RoutedEventArgs - übergeben werden muss (wie z.B. "null", was aber nicht funktioniert), oder dass "Tick" nicht als valides Signal erkannt wird - kann das sein??

    2. if (progressBar1.Value <= timer .Maximum)

    "Der Name "timer" ist im aktuellen Kontext nicht vorhanden."

    Das sagt mir eigentlich, dass der Tick-Eventhandler im falschen Scope steht und direkt in den Eventhandler LayoutRoot_Loaded verschoben werden müsste.

    Allerdings besteht das Problem auch dann fort, und im Buch steht es ja auch so drin.

    Also ich bin mal gespannt auf eure Antworten :)

    Samstag, 29. Januar 2011 17:17

Antworten

  • Guten Morgen,

     

    zu 1.) habe ich die Vermutung, dass es am Typ des Parameter "e" der Methode "timer_Tick" liegt. Hier sollte ein Typ von EventArgs verwendet werden:

    void timer_Tick(object sender, EventArgs e)

    zu 2.) tippe ich auch, dass es an der lokal verwendeten Objekte in der Methode liegt. In meinem Beispiel zur Vibrationsklasse auf Seite 358 habe ich den Dispatcher als auch das Tick Ereignis verwendet (Listing 6.25)

    Gruss

     

    Simon Hackfort

    Montag, 31. Januar 2011 06:24
  • Hallo und vielen Dank für die Antworten!

     

    Also das 1. Problem hat einen ganz blöden Fehler zum Ursprung:

    if
    
    
     (progressBar1.Value <= timer.Maximum)

    Hier frage ich versehentlich nach einem Maximum -Wert des Timers , dabei geht es doch natürlich um jenen der ProgressBar !

    also in diesem Fall

    if
    
    
     (progressBar1.Value <= progressBar1.Maximum)

    Hätte mich auch gewundert, wenn das Objekt vor dem Ende des kompletten Durchlaufs aufgelöst worden wäre!

     

    Das 2. liegt wirklich daran, dass ein Parameter vom Typ EventArgs statt RoutedEventArgs erwartet wird.

     

    Nochmals danke und schöne Grüße

     

    • Als Antwort markiert overtonemagic Dienstag, 1. Februar 2011 19:36
    Dienstag, 1. Februar 2011 19:35
  • Hallo.

    Ich weiß jetzt nicht so ganz, was ich davon halten soll: Vor ein paar Stunden habe ich hier etwas gepostet und die Antworten markiert, alles ganz normal, doch nun ist alles wieder weg.

    Was soll's, dann eben nochmal:

     

    Das 1. Problem hat einen ganz blöden Fehler zum Ursprung: Ich habe versehentlich einen Maximum-Wert des Timers auslesen lassen, anstatt jenen der ProgressBar. Hier die Code-Zeile in korrekter Form:

    if (progressBar1.Value <= progressBar1.Maximum)

    Das Objekt wird nicht aufgelöst, der Eventhandler muss ja durchlaufen, bis die letzte Anweisung erfüllt ist - bis zum Ende der Methode Start(). Also lädt sich die ProgressBar ganz normal bis zur Vollständigkeit auf.

    Das 2. Problem lag aber wirklich an dem Parameter EventArgs.

     

    Vielen Dank für die Hilfe und schöne Grüße!

     

    • Als Antwort markiert overtonemagic Dienstag, 1. Februar 2011 22:29
    Dienstag, 1. Februar 2011 22:28

Alle Antworten

  • Hi,

    zu 1.: Kann ich aktuell nichts sagen, da ich kein Visual Studio hier habe.
    zu 2.: Du deklarierst den Timer im Loaded-Ereignis. Damit wird dieses auch nur innerhalb dieser Methode verwendet. Sobald die Methode verlassen wird, kann auch das Tick-Ereignis nicht mehr ausgeführt werden, da das zugehörige Objekt bereits "aufgeräumt" wurde.
    Ist das Objekt nicht mehr da, kann auch das zugehörige Ereignis nicht mehr ausgeführt werden...

    Gruß, Peter


    This posting is provided "AS IS" with no warranties, and confers no rights.
    Montag, 31. Januar 2011 05:46
  • Guten Morgen,

     

    zu 1.) habe ich die Vermutung, dass es am Typ des Parameter "e" der Methode "timer_Tick" liegt. Hier sollte ein Typ von EventArgs verwendet werden:

    void timer_Tick(object sender, EventArgs e)

    zu 2.) tippe ich auch, dass es an der lokal verwendeten Objekte in der Methode liegt. In meinem Beispiel zur Vibrationsklasse auf Seite 358 habe ich den Dispatcher als auch das Tick Ereignis verwendet (Listing 6.25)

    Gruss

     

    Simon Hackfort

    Montag, 31. Januar 2011 06:24
  • Hallo und vielen Dank für die Antworten!

     

    Also das 1. Problem hat einen ganz blöden Fehler zum Ursprung:

    if
    
    
     (progressBar1.Value <= timer.Maximum)

    Hier frage ich versehentlich nach einem Maximum -Wert des Timers , dabei geht es doch natürlich um jenen der ProgressBar !

    also in diesem Fall

    if
    
    
     (progressBar1.Value <= progressBar1.Maximum)

    Hätte mich auch gewundert, wenn das Objekt vor dem Ende des kompletten Durchlaufs aufgelöst worden wäre!

     

    Das 2. liegt wirklich daran, dass ein Parameter vom Typ EventArgs statt RoutedEventArgs erwartet wird.

     

    Nochmals danke und schöne Grüße

     

    • Als Antwort markiert overtonemagic Dienstag, 1. Februar 2011 19:36
    Dienstag, 1. Februar 2011 19:35
  • Hallo.

    Ich weiß jetzt nicht so ganz, was ich davon halten soll: Vor ein paar Stunden habe ich hier etwas gepostet und die Antworten markiert, alles ganz normal, doch nun ist alles wieder weg.

    Was soll's, dann eben nochmal:

     

    Das 1. Problem hat einen ganz blöden Fehler zum Ursprung: Ich habe versehentlich einen Maximum-Wert des Timers auslesen lassen, anstatt jenen der ProgressBar. Hier die Code-Zeile in korrekter Form:

    if (progressBar1.Value <= progressBar1.Maximum)

    Das Objekt wird nicht aufgelöst, der Eventhandler muss ja durchlaufen, bis die letzte Anweisung erfüllt ist - bis zum Ende der Methode Start(). Also lädt sich die ProgressBar ganz normal bis zur Vollständigkeit auf.

    Das 2. Problem lag aber wirklich an dem Parameter EventArgs.

     

    Vielen Dank für die Hilfe und schöne Grüße!

     

    • Als Antwort markiert overtonemagic Dienstag, 1. Februar 2011 22:29
    Dienstag, 1. Februar 2011 22:28
  • Na toll, jetzt wird der alte Beitrag plötzlich wieder angezeigt. Mehrmals habe ich die Seite neu geladen und mich aus- und eingeloggt, um zu sehen, ob er wirklich nicht mehr da ist.

    Im Übrigen seh ich gerade, dass ich 1. und 2. Problem miteinander verwechselt habe!

    Dienstag, 1. Februar 2011 22:35