Laden...

Prozesse im Hintergrund weiterlaufen lassen

Erstellt von Chefspatz vor einem Jahr Letzter Beitrag vor einem Jahr 735 Views
C
Chefspatz Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr
Prozesse im Hintergrund weiterlaufen lassen

Hallo, ich habe folgende Frage:

Ich habe ein WPF mit mehreren Pages erstellt. Wenn ich nun einen Timer auf Page1 starte (ich habe einfach einen Button drauf platziert, der einen DispatcherTimer startet) und zu Page2 wechsel, dann stoppt der Timer von Page1. Wie kann ich es erreichen, dass Prozesse einer Page weiterlaufen, auch wenn ich die aktuelle Page wechsel?

16.806 Beiträge seit 2008
vor einem Jahr

Erklär mal, was Du überhaupt tun willst - dann können wir Dir sagen, ob das mit dem Timer überhaupt sinnvoll ist, oder ob Du im Dunkeln tappst.
Timer in Pages sind sehr selten sinnvoll.

C
Chefspatz Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr

Ich möchte ein kleines Spiel schreiben, wo man bestimmte Elemente anklicken und warten muss. Also der Spieler klickt einen Button an und muss 50 Sekunden warten, in der Zeit kann er dann auf eine andere Page gehen und da vielleicht auch einen Button drücken, der wieder X Sekunden braucht, ehe etwas passiert.

16.806 Beiträge seit 2008
vor einem Jahr

Dafür gibts sicher elegantere Lösungen, aber sofern Du einen DispatcherTimer sollte es das Pausieren hier nicht geben.
Du arbeitest sauber nach MVVM mit ViewModels und einem entsprechenden Binding?
[Artikel] MVVM und DataBinding

Mit Reactive Extensions in .NET könnte man das komfortabel über eine Timer Subscription lösen.


// ViewModel
IsEnabledSubmitButton = false;

_isEnabledSubmitButtonDelaySubscription =
    Observable.Timer(TimeSpan.FromSeconds(50))
    .Subscribe(
        x =>
        {
            IsEnabledSubmitButton = true;
                        
            if (_isEnabledSubmitButtonDelaySubscription is not null)
            {
                _isEnabledSubmitButtonDelaySubscription.Dispose();
                _isEnabledSubmitButtonDelaySubscription = null;
            }
        });

C
Chefspatz Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr

Nein, ich glaube am Binding hapert es. Ich werde mir den Link mal anschauen und mich wieder melden.

C
Chefspatz Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr

Ok, ich habe mir das durchgelesen und auch noch viel gegoogelt und einiges über MVVM erfahren. Das ist wohl eine Möglichkeit, den Code lesbarer und sauberer zu schreiben - ich würde das Prinzip auch einsetzen, wenn ich das Binding über Pages hinaus verstehen würde. Ich würde gerne zunächst einmal zwei Elemente, z.B. eine Textbox und einen Textblock auf zwei verschiedenen Seiten binden. Dass ich also auf einer Seite etwas am Textinhalt ändere und die andere Box sich auch ändert.

Wenn ich das aber so mache, funktioniert es nicht:

Page 1:


<TextBox Name="TextBox1" Text="?" Height="100" Width="600" BorderBrush="#FF0C0000" TextAlignment="Center" FontSize="20" TextWrapping="Wrap"  AcceptsReturn="True"  VerticalScrollBarVisibility="Visible" />

Page 2:


<TextBlock  Name="textblock1" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="50" Text="{Binding ElementName=QuestTextBox, Path=Text}"  />

Ich denke mal, dass das Programm auf Seite 2 nicht die Elemente von Seite 1 kennt. Daher dachte ich mir schon, dass man irgendwo angeben müsste. Aber ich finde nichts daz im Netz.

Sollte ich lieber die ganze Sache aufgeben, weil es zu schwer für mich und eher etwas für Fortgeschrittene Programmierer ist? Das Binding auf einer Seite ist so einfach zu verstehen, dass ich nicht dachte, dass das Binding zwischen Seiten so schwer sein könnte. Ich verstehe irgendwie die ganze Logik daginter nicht.

16.806 Beiträge seit 2008
vor einem Jahr

Aufgeben ist keine Option, das kann man alles lernen - jede:r hat es lernen müssen.
Aber es gibt dazu viele Tutorials, womit alle an ihr Ziel kommen können.

WPF ist so konzipiert, dass man MVVM verwendet. Verwendet man das nicht, wird man viele Probleme haben und Workarounds bauen müssen.
Das ist 10x schwerer und komplexer als MVVM zu lernen und anzuwenden - und am Ende besteht die Anwendung aus Kraut und Rüben.

Ja, das ist eine Einstiegshürde und ja, mit einem Try-And-Error-Vorgehen, das man zB. bei WinForms durchaus anwenden konnte, um schnell zu Ergebnissen zu kommen, klappt bei MVVM - egal ob nun bei WPF oder bei Angular, in der Regel nicht.
Da wird man kaum um echte Tutorials drum herum kommen, sonst kann man das Konzept eigentlich auch nicht verstehen.

Beim WPF "Nachfolger" MAUI kann man auch den MVU Pattern verwenden, das ein etwas leichtgewichtigeres Konzept verfolgt.
In WPF kann man MVU ohne entsprechende Bibliotheken (wie von Elmish) leider nicht anwenden.

D
6 Beiträge seit 2022
vor einem Jahr
MVVM

Moin,

bei MVVM geht es nicht um die Code Schönheit. Bei kleinen Anwendungen macht das eigentlich weniger Sinn aber bei größeren wird man dir dankbar sein. Du schreibst generell dann nichts in die xaml.cs sondern alles in einem Viewmodel welchen du mit den DataContext setzt bzw definierst wo die aktionen eigentlich stattfinden. Dazu benötigst INotifyPropertyChanged. Mit ein bisschen Googlen kommt man hier schnell drauf was der Sinn dahinter ist.

LG