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
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 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
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:
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-
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.
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
- Interfacewelches 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.