LifeCycle zu Windows

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von seh.

    LifeCycle zu Windows

    Hi,

    ich verstehe noch nicht ganz, wie der "LifeCycle" von Windows in der WPF abläuft.

    Angenommen ich habe ein MainWindow und ein TestWindow.
    Das MainWindow wird standardmäßig geöffnet.

    Jetzt bin ich aktuell etwas am rumtüfteln, um mit MVVM eine Window Navigation zu erstellen ohne dabei Zugriff auf das eigentliche View zu benötigen.
    Dafür habe ich mir eine statische ViewFactory Klasse erstellt, welche Views und deren zugehörige ViewModels in eine simple Liste registriert.
    Mit ViewFactory.GetView<TViewModel>() kann ich dann von jedem ViewModel aus auf ein anderes ViewModel zugreifen welches auch registriert ist.
    Naja so ähnlich funktioniert es jedenfalls. Ob das gut oder schlecht ist oder überhaupt nichts mit MVVM zu tun hat, darüber lässt sich gerne streiten, ist aber bitte erstmal nicht Hauptthema.
    Ich verstehe etwas anderes nicht.
    Meine ViewFactory hat zwei Methoden RegisterView<TView>() und CreateView<TViewModel>() .
    RegisterView ist erstmal dazu da um die Typen zu registrieren.
    CreateView ist dann für das eigentliche instanzieren des Views gedacht.

    D.h. CreateView legt eine Instanz von meinem Window an, öffnet dieses aber noch nicht mit Show() oder ShowDialog(). Jedes meiner Windows implementiert ein IView - Interface
    welches Methoden wie Open(), Close() implementieren soll. Die Methoden gibt is in der Window Klasse standardmäßig und müssen daher garnicht mehr implementiert werden, das fand ich sehr praktisch.

    D.h. mein MainWindow will z.B. bei Klick auf einen Button ein TestWindow erstellen um dort weiteres zu erledigen.
    Der Button bindet sich im MainViewModel zu einem ICommand ButtonClick... In diesem ButtonKlick "Ereignis" wollte ich dann folgendes machen:

    ViewFactory.CreateView<TestViewModel>()
    CreateView liefert mir das IView Interface zurück und ich kann daher dann die Methoden benutzen .Close() oder eben .Open().
    Da das Fenster mit CreateView zwar instanziert aber noch nicht Ge-Open()-ed wurde, rufe ich Open() auf.
    Das Fenster öffnet sich auch. Alles super. Wenn ich dann alle beiden Fenster schließe beendet sich die Applikation wie es sein soll.
    Was mich aber stört ist, wenn ich mit CreateView das Fenster instanziere, es aber nicht öffne und dann das MainWindow schließe, dann bleibt die Applikation gestartet, weil das TestWindow noch instanziert ist (aber nicht geöffnet). Die App beendet sich erst wenn ich trotz geschlossenem TestWindow .Close() aufrufe.

    D.h. irgendwas blockiert solange das Window nicht geschlossen ist, obwohl es nie geöffnet, nur instanziert wurde. Nun meine Frage, warum ist das so und macht es Sinn dann jedes Mal close aufzurufen obwohl nie geöffnet wurde?

    Kann mir da wer mehr Informationen geben?
    Über meine rumtüfteilei mit so einer ViewFactory könnt ihr auch gerne diskutieren nur macht es erstmal bitte nicht zum Hauptproblem. Ich will erstmal erfahren wie das Window funktioniert. :thumbsup:
    Hallo seh.

    Gleich vorweg möchte ich sagen da du hier keinen Fehler hast sondern ein von der WPF gewolltes Verhalten.
    Hast du im Anwendungsframework unter "Modus für das Herunterfahren" die Option "Beim schlissen des letzten Fensters" aktiviert, wird die Anwendung nicht beendet.

    Warum dies so "gemacht" wurde kann ich dir nicht genau sagen, ich habe nur eine Theorie.
    Nehmen wir an man möchte dem User ein anderes Fenster öffnen müsste man ja immer erst das neue Fenster öffnen und über das andere legen und erst dann das erste Fenster schliessen.
    Denn sonst würde sich die Anwendung sofort beenden da ja einen kurzen Moment KEIN Fenster offen wäre.

    Evtl. hat Microsoft hier gesagt das es besser ist wenn wir nachsehen ob ein Fenster instanziert wurde damit dies nicht unbedingt notwendig ist. Denn so kannst du ein zweites Fenster instanzieren und das erste Fenster schliessen und erst danach das zweite Fenster öffnen.

    Grüße
    Sascha

    PS: Zu deiner ViewFactory.... Warum sollen wir hier eine Diskussion anfangen. Das ist ein ganz logischer Weg wenn man das MVVM Pattern durchsetzen möchte ohne einen Verweis auf die View zu benötigen (was ja falsch wäre).
    Das ist schon richtig so, solange du es richtig implementierst. Weiter so, finde ich gut wenn jemand versucht MVVM richtig umzusetzen und nicht einfach irgendein Framework benutzt. :thumbsup:
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo @Nofear23m

    Nofear23m schrieb:

    Hast du im Anwendungsframework unter "Modus für das Herunterfahren" die Option "Beim schlissen des letzten Fensters" aktiviert, wird die Anwendung nicht beendet.


    Das kannte ich noch gar nicht, wo finde ich das denn, ich habe jetzt unter den Projekteinstellungen gesucht?
    Aber wie du das erklärt hast ist natürlich einleuchtend, ich werde mich mal schlauer machen und mich noch was informieren und weiter tüfteln.

    Nofear23m schrieb:

    finde ich gut wenn jemand versucht MVVM richtig umzusetzen und nicht einfach irgendein Framework benutzt

    Jaa, ich bin der Meinung in Frameworks muss man sich auch einarbeiten und versteht dann noch nicht mal unbedingt was eigentlich dahinter steckt und was mir für eine Arbeit abgenommen wird. Mich interessiert das wirklich wie es "from scratch" funktioniert und ich mag es meine Software "slim" zu halten sodass nur das drinne ist, was es wirklich braucht (natürlich schon mit Vorsicht auf spätere Erweiterbarkeit). :)

    Vielen Dank schon mal, ich werde heute mal schauen wie ich weiter komme.
    Mit der ViewFactory hab ich das mal in einem anderen Projekt gesehen, und das hat mir eigentlich sehr gut gefallen, da eben auch keine Referenz zum eigentlichen View benötigt wird. Ich lerne viel von anderen Projekten auf GitHub und habe zum Glück aber ein wenig Verstand was davon guter Code oder schlechter Code ist. Nur hilft mir mein Halbwissen über die Windows dann in WPF gerade nicht weiter ^^ Aber gut, geht nichts über studieren.
    Hallo

    seh schrieb:

    Das kannte ich noch gar nicht, wo finde ich das denn, ich habe jetzt unter den Projekteinstellungen gesucht?

    Habe dir mal nen Screenshot gemacht.


    seh schrieb:

    Jaa, ich bin der Meinung in Frameworks muss man sich auch einarbeiten und versteht dann noch nicht mal unbedingt was eigentlich dahinter steckt und was mir für eine Arbeit abgenommen wird. Mich interessiert das wirklich wie es "from scratch" funktioniert und ich mag es meine Software "slim" zu halten sodass nur das drinne ist, was es wirklich braucht (natürlich schon mit Vorsicht auf spätere Erweiterbarkeit).

    Finde ich super, vorallem. So hast DU es in der Hand und wenn wo ein Bug drinnen ist kannst DU ihn ausbessern und bist nicht auf andere angewiesen. Sehe ich auch so. :thumbup:

    Ich habe zwar keine ViewFactory aber ähnlich. Ich habe mehrere "Aufgaben" zusammengefasst.
    Vieleicht als Input für dich. Ich habe einen ServiceContainer mit den Methode AddService und GetService und packe dort alles hinein was ich so benötige.
    IDialogService, IWindowService, IWaitingCursorService, IOpenFolderDialog und, und, und!

    So habe ich alles beisammen und immer die Kontrolle.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo seh

    Ja, ok. Du Arbeitest unter C#. Ich glaube da gibt es das Anwendungsframework erst gar nicht, genau wie den My.Namespace.
    Ich glaube unter C# gilt immer die Anwendung als beendet wenn das letzte Fenstrer geschlossen wurde. Einzig eine selbstimplementierung würde helfen.

    Tut aber nix zur sache das mit dem Instanzieren eines Fensters hier schon "blockiert" wird.

    Aber...... Wenn du überall wie es sich gehört IDiaposable implementiert hast und beim Disposen dann auch die Views aus der ViewFactory zerstörst darf du hier ja erst gar keine probleme haben das die Anwendung nicht beendet wird. =O Evtl. hast du hier einen Architekturfehler. Im Grunde darf das ja gar nicht passieren können.

    seh schrieb:

    Ja verstehe, so ein ServiceContainer ist nicht schlecht, ist dann auch Dependency Injection konform oder?

    Jep. feine Sache.


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo @Nofear23m,

    ich werde wahrscheinlich auch einen allgemeinen Service Container schreiben. Das macht wesentlich mehr Sinn wenn man den dann für alle möglichen Dienste verwenden kann.
    Wie definierst du denn View's zerstören? So viel ich weiß implementiert ein Window bei WPF IDisposable nicht. Zerstöre ich das View dann trotzdem mit Close obwohl ich es eventuell nie geöffnet habe? Das scheint nämlich zu funktionieren.
    Naja, deine ViewModel-Basisklasse wird aber vermutlich (hoffentlich) IDisposable implementieren richtig?

    Ich habe mir das IWindowService so gebaut das ich hier nicht X instanzen von Window (oder Views) drinnen habe.
    Ich habe das ein wenig anders gelöst.

    Gerne kann ich dir ein Beispiel zeigen wenn du willst.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi, jap genau, meine ViewModelBase implementiert im Moment INotifyPropertyChanged und IDisposable. Habe noch ne virtuelle Dispose Methode welche dann von meinen ChildViewModels bei Bedarf überschrieben werden können.

    Beispiele? Klar immer her damit wäre super lieb. Vielen Dank

    Vollzitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Hallo

    Habe schnell was zusammengezimmert. Ist jetzt nicht perfekt, man könnte jetzt noch viel mit Interfaces spielen um das ganze sauberer zu bekommen sollte aber mal zeigen was ich meine.

    Grüße
    Sascha
    Dateien
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##