Laden...

Fenster schließt bei ShowDialog wenn Hidden

Erstellt von Oberons vor einem Jahr Letzter Beitrag vor einem Jahr 504 Views
O
Oberons Themenstarter:in
12 Beiträge seit 2022
vor einem Jahr
Fenster schließt bei ShowDialog wenn Hidden

Hallo Zusammen,

ich bin vor kurzem mit der Programmierung in C# angefangen und nun über eine Sache gestolpert, die ich mit so nicht erklären kann.

Ich habe in Visual Studion 2022 ein WPF-Window in mein Programm eingebaut, dass da als MainWindow funkiert.
Wenn ich aus diesem Fenster mit ShowDialog ein weiteres Fenster aufrufe, wird das MainWindow nach dem Schließen des anderen Fensters beendet, wenn das MainWindow
den Visibility Status "Hidden" oder "Collapsed" hat. Ist das MainWindow visible wird nach dem Schließen des zweiten Fensters wie gewollt im MainWindow weitergemacht.

Daher die Fragen: Wieso wird das MainWindow (und damit das Programm) beendet, wenn es nicht visible ist und wie kann ich das umgehen?

Besten Dank im Voraus.

CU
Oberons

4.931 Beiträge seit 2008
vor einem Jahr

Hallo und willkommen,

das ist das Standardverhalten beim Hauptfenster - wenn dieses geschlossen oder nicht mehr sichtbar ist, dann wird die gesamte Anwendung geschlossen (d.h. der Prozess beendet).
Das ist bei WPF nicht so einfach zu umgehen, da der Code dazu automatisch aus den XAML-Daten erzeugt wird (außer mittels des Application.Startup-Ereignisses, aber dann mußt du den gesamten Startup-Code dort erzeugen - s. Beispiel mittels new MainWindow()).

Warum willst du das denn (und was soll der Anwender dann mit deiner Anwendung noch weiter tun können)?

2.078 Beiträge seit 2012
vor einem Jahr

Die Application hat eine ShutdownMode-Property, darüber kannst Du definieren, wann er automatisch die Anwendung beenden soll.
Eventuell hilft das?

O
Oberons Themenstarter:in
12 Beiträge seit 2022
vor einem Jahr

Hallo Th69,

besten Dank für Deine Antwort. Damit wäre das Verhalten ja schonmal erklärt. Ich hatte es erst im Visible-Zustand getestet und da lief es wie gewünscht, als es dann bei Hidden das Programm beendet hat war ich schon ein wenig verwundert.

Bei dem Prgramm kann sich der User per Login anmelden, dann halt machen was er will und dann möchte ich ihm die Möglichkeit geben sich auszuloggen ohne das Programm zu beenden.
Es soll dann also das MainWindow versteckt werden und das Login-Fenster erscheinen. Der nächste User muss sich dann bevor er was machen kann neu anmelden, brauch aber nicht das ganze Programm neu starten, sondern es muss nur das MainWindow wieder eingeblendet werden. Wenn das MainWindow dann im Hintergrund offen ist wäre das nicht der Hit. Gibt es da einen anderen Ansatz?

CU
Oberons

4.931 Beiträge seit 2008
vor einem Jahr

Dann setze das MainWindow doch wieder auf Visible nach dem ShowDialog-Aufruf (d.h. wenn der Login erfolgreich war - ansonsten zeige wieder das Login-Fenster an, solange bis der Anwender "Abbrechen" (Cancel) auswählt).

O
Oberons Themenstarter:in
12 Beiträge seit 2022
vor einem Jahr

Hi Palladin007,

das hörte sich wie eine mögliche Lösung leider. Leider ist das Verhalten bei "OnLastWindowClose" das gleiche wie beim Default-Wert.
Bei "OnExplicitShutdown" wird das Programm zwar nicht beendet, das MainWindow wird aber auch nicht wieder eingeblendet.

@Th69

So sieht die LogOut_methode aus:


        public void UserLogOut(object sender, RoutedEventArgs e)
        {
            this.Visibility = Visibility.Hidden;
            User_Change(this, null);
            this.Visibility = Visibility.Visible;
        }

In der Methode User_Change wird dann das Window mit der Login-Form wieder aufgerufen.
Btw: Gibt es eine bessere Möglichkeit die Parameteranforderung: "(object sender, RoutedEventArgs e)" zu erfüllen?

Und so startet das MainWindow:


            InitializeComponent();
            Window window = new Window1();
            window.ShowDialog();
            if (Window1.Active_User != "") 
            {
                this.ShowDialog();

Es wird erst die Login-Form aufgerufen und wenn das erfolgreich war, wird mit "this.ShowDialog()" das MainWindow gestartet.
Genau in der Zeile landet das Programm auch wieder, wenn die Methode UserLogOut beendet wird.
Ist das MainWindow sichtbar wird es ganz normal eingeblendet und ist benutzbar. Wenn das MainWindow unsichtbar ist, geht er im nächsten Step weiter, verläßt die if-Verzweigung und landet dann außerhalb bei this.close und das Programm wird beendet. Active_User ist einfach eine Variabel, die den Wert des angemeldeten Benutzers bekommt.

Wäre schön, wenn es dafür eine Lösung gäbe.

CU
Oberons

4.931 Beiträge seit 2008
vor einem Jahr

In der Methode User_Change wird dann das Window mit der Login-Form wieder aufgerufen.

Ich habe da einen Verdacht - wie rufst du dort das MainWindow wieder auf?

Und ersetze im MainForm-Konstruktor mal this.ShowDialog() durch this.Show() (d.h. dies entspricht this.Visibility = Visibility.Visible). Du möchtest ja nicht das MainWindow innerhalb vom Konstruktor modal anzeigen.

O
Oberons Themenstarter:in
12 Beiträge seit 2022
vor einem Jahr

Ich habe da einen Verdacht - wie rufst du dort das MainWindow wieder auf?

Eigentlich gar nicht. Das Window mit der LogIn-Form wird auch mit this.Close beendet. Und es soll im MainWIndow weitergehen. Was es ja auch tut, wenn das MainWindow sichtbar ist.

Wenn ich this.ShowDialog() durch this.Show() ersetze bekomme ich das Window nicht zu sehen. Es flackert kurz etwas auf was wie ein Fenster aussieht, aber nicht erkennbar ist, und danach wird das Programm beendet.

CU
Oberons

O
Oberons Themenstarter:in
12 Beiträge seit 2022
vor einem Jahr

Hi,

schonmal besten Dank für die Hilfe bis hierhin. Ich habe mir jetzt erstmal so beholfen:


        public void UserLogOut(object sender, RoutedEventArgs e)
        {
            this.Opacity = 0.0;
            User_Change(this, null);
            this.Opacity = 1.0;
        }

Sieht nicht schön aus, aber das MainWindow ist nicht mehr bedienbar und es geht anschließend dort weiter.

Wenn es noch eine Lösung gäbe, bei der das Fenster ausgeblendet ist, wäre ich dafür sehr dankbar.

CU
Oberons

O
Oberons Themenstarter:in
12 Beiträge seit 2022
vor einem Jahr

Hi,

besten Dank für die Hilfe.

Der Hinweis mit dem Konstruktor war letzten Endes entscheidend.
Ich habe eine Methode erstellt, die nichts anderes macht als this.Show() und die im Konstuktor aufgerufen wird.

Damit klappt es jetzt wie gewollt, egal ob visible oder nicht. Da macht es auch keinen Unterschied ob ich Show oder ShowDialog verwende.

CU
Oberons