Mehrmaliges Laden eines Timer Objektes

  • WP8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Walchhofer.

    Mehrmaliges Laden eines Timer Objektes

    Hallo Leute,

    ich habe ein Phone-Projekt, welches mit MainPage startet, und dann von hier aus wechselweise
    Page1 und Page2 aufruft.

    Dabei habe ich in Page2 einen Timer, der am Anfang von Page 2 mit New erzeugt wird.
    Unten seht Ihr den für den Timer zuständigen Codeteil. In diesem Fall erhöht der Timer
    die Beschriftung des Buttons immer 1 - 2 - 3 usw.

    Wenn ich jetzt von Page2 auf Page1 wechsle, und dann wieder Page2 aufrufe, wird diese Zeile wieder
    ausgeführt und wieder ein Timer erzeugt.
    Ich habe dann also schon 2 Timer, meine Sub wird dann zweimal aufgerufen.
    Sehe ich auch darin, dass die Beschriftung jetzt geht 1 - 3 - 5 usw.

    Beim nächsten Mal starten der Page2 habe ich dann schon 3 Timer, die Sub wird dreimal aufgerufen. Usw.

    Ich suche also entweder eine Möglichkeit -

    den Timer nur das erstemal zu erzeugen (so irgendwie If TmpTimer = NIL then WithEvents TmpTimer As New System.Windows.Threading.DispatcherTimer)
    aber das klappt in diesem Teil des Codes nicht,

    Wenn ich im Codeteil (wo ich so eine Abfrage machen könnte), versuche dies zu schreiben, kann ich zwar einen Timer erzeugen,
    aber ohne dem Schlüsselwort WithEvents, und dann kann ich keinen Handler darauf erzeugen,

    den Timer zum Schluss jedesmal zu zerstören, aber TmpTimer kennt kein .Dispose ?

    oder in der übergeordneten MainPage den Timer zu erzeugen, nur kann ich von MainPage.TimerTick keine Sub in Page2 aufrufen ?

    Irgendwie stecke ich, wahrscheinlich ist die Lösung simpel, aber ich sehe Sie nicht,
    Danke Michael

    Quellcode

    1. Partial Public Class Page2
    2. Inherits PhoneApplicationPage
    3. WithEvents TmpTimer As New System.Windows.Threading.DispatcherTimer
    4. Public Sub New()
    5. InitializeComponent()
    6. TmpTimer.Interval = New TimeSpan(0, 0, 0, 0, 100)
    7. TmpTimer.Start()
    8. End Sub
    9. Sub TimerTick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TmpTimer.Tick
    10. Gem_Allgemein.TimerZaehler += 1
    11. Me.ButtonTimer.Content = Gem_Allgemein.TimerZaehler.ToString
    12. End Sub
    13. Private Sub Button_Click_2(sender As Object, e As RoutedEventArgs)
    14. Module1.AktStatus = "Page1"
    15. If NavigationService.CanGoBack Then NavigationService.GoBack()
    16. End Sub
    17. Protected Overrides Sub Finalize()
    18. MyBase.Finalize()
    19. End Sub
    20. End Class

    Mit AddHandler gelöst

    Hallo ErfinderDesRades,

    herzlichen Dank für Deine Antwort, deinen Ansatz hatte ich bereits probiert,
    es läuft dann im übergeordneten MainPage der Timer brav mit (und hier nur einer, da die MainPage nur einmal aufgerufen wird),
    Problem - ich kann vom Timer im VB-Modul der MainPage zwar z.B. eine Public Variable erhöhen, aber keine
    Sub in Page2 aufrufen, die mir z.B. Page2.ButtonText neu schreibt. Weil das Objekt Page2 immer neu erzeugt wird.

    Das scheint auch mein Problem hier zu sein, bei jedem Aufruf von Page2 wird ein neues Objekt erzeugt. Einfach nur Hide() und Show()
    wie bei den normalen Windows.Forms scheint es bei WPhone nicht zu geben.

    Meine Lösung funktioniert mit AddHandler, den kann ich dann auch zum Schluss wieder löschen. (Und wenn ich das nicht tue, läuft er
    brav im Hintergrund weiter, und ist dann mein 2./3./4. Timer, das gleiche Problem)

    Quellcode

    1. Partial Public Class Page2
    2. Inherits PhoneApplicationPage
    3. Dim MyTimer As New System.Windows.Threading.DispatcherTimer
    4. Sub myTimerTick(ByVal sender As System.Object, ByVal e As System.EventArgs)
    5. AllgemeineVariablen.TimerZaehler += 1
    6. Me.ButtonTimer.Content = AllgemeineVariablen.TimerZaehler.ToString
    7. End Sub
    8. Private Sub Page2_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    9. MyTimer.Interval = New TimeSpan(0, 0, 0, 0, 100)
    10. AddHandler MyTimer.Tick, AddressOf myTimerTick
    11. MyTimer.Start()
    12. End Sub
    13. Private Sub Page2_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.Unloaded
    14. RemoveHandler MyTimer.Tick, AddressOf myTimerTick
    15. End Sub
    16. End Class
    es ist halt nur ein architektonischer Ansatz. Von Wp8 konkret habich keine Ahnung.
    Kennst du eiglich den MVVM–Pattern (Josh Smiths Artikel)?
    Da würde man dergleichen vlt. im Viewmodel organisieren, und statt Pages DataTemplates nehmen.

    aber wie gesagt: u.U. ist das auf Navigation in Wp8 nicht übertragbar (aber vlt. halt doch)
    Hallo,

    und danke - also diese WP Programmierung unterscheidet sich stark von der Windows-Forms Programmierung.

    Ich versuche derzeit, ein doch recht umfangreiches Projekt von Windows auf WPhone zu portieren. Keine leichte Übung.

    Dabei versuche ich, ein Modell zu machen, welches dem MVVM-Modell verwandt ist. Ich versuche dabei, die Anzeige und Benutzeraktion und die Programmlogik zu trennen. Damit auch die Windows-Version und die WPhone-Version möglichst in den Funktionsteilen identisch bleiben. Da ich beide Versionen brauche, und bei Änderungen es leichter ist, wenn die Programmfunktionen identisch sind, und nur die Benutzerschnittstellen sich unterscheiden.

    Es scheint so zu klappen, die Frage bleibt, ob nicht ein sauberes Neuschreiben dann im Endeffekt weniger aufwändig gewesen wäre,

    LG Michael