Laden...

WPF-Anwendung mit mehreren Fenstern schließen

Erstellt von zeenqah vor 8 Jahren Letzter Beitrag vor 8 Jahren 6.138 Views
Thema geschlossen
Z
zeenqah Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren
WPF-Anwendung mit mehreren Fenstern schließen

Ich sitze derzeit nebenbei an einer kleinen WPF-Auftragsverwaltung, habe jedoch das Problem,
dass diese sich nicht schließen lässt, selbst wenn alle Fenster samt Hauptfenster einzeln geschlossen werden. Ich bin noch etwas unerfahren bzgl. grafischer Programmierung, habe bisher nur Konsolenanwendungen geschrieben. Ich habe etwas über Application.Exit(); recherchiert aber habe keinen Schimmer darüber wo und wie ich es einsetzen soll.

Zum Programm selbst:
Ich habe keine wirkliche Ablaufsklasse a la program.cs, überprüfe Benutzereingaben etc über Methoden, übergebe an Klassen die Eingaben als Attribute, und lasse eine extra Datenbankzugriffsklasse diese einspeichern/ändern/löschen etc.

Zum Problem in Detail:
Ich habe im Hauptfenster, das zugleich als Übersicht und Auswahlmenü des Verwaltungsprogramms dient, einen Beenden-Button, bei Klick wird eine Methode aufgerufen, die das Programm schließen soll. this.Close(); schafft Abhilfe, solange nur ein Fenster offen ist.
Bei den anderen Buttons werden bei Klick neue Fenster erzeugt, in denen die einzelnen Funktionen der Auftragsverwaltung angesiedelt sind. Diese werden ebenfalls über einen Button mittels this.Close(); geschlossen.

Kann mir diesbezüglich jemand ein Codebeispiel geben?

J
251 Beiträge seit 2012
vor 8 Jahren

Beenden-Button, bei Klick wird eine Methode aufgerufen, die das Programm schließen soll.

Besteht diese Methode nur aus der Zeile

this.Close();

?

Das Hauptfenster schließt sich per Klick solange kein weiteres Fenster geöffnet wurde? Da ist es abhängig wie dieses weitere Fenster aufgerufen wurde.

Das "this" bezieht sich nicht auf die ganze Anwendung sonders auf die jeweilige Instanz der Klasse => this

Z
zeenqah Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren

Uebersicht.xaml.cs -> quasi die MainWindow-Klasse

    private void btn_neuerauftrag_Click(object sender, RoutedEventArgs e)
        {
            this.Visibility = Visibility.Hidden;
            AuftragAnlegen Fenster_AuftragAnlegen = new AuftragAnlegen();
            Fenster_AuftragAnlegen.Owner = this;
            Fenster_AuftragAnlegen.Show();            
        }

    private void btn_beenden_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
                            
        }

AuftragAnlegen.xaml.cs -> ein von der MainWindow-Klasse mittels Buttonevent geöffnetes Fenster

    private void btn_beenden_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
            Uebersicht Fenster_Uebersicht = new Uebersicht();
            Fenster_Uebersicht.Visibility = Visibility.Visible;
        }

Die Verwendungsweise von this ist mir schon klar, daran lag ja das Problem nicht.

F
10.010 Beiträge seit 2004
vor 8 Jahren

Du erzeugst hier ständig neue Fenster und versteckst sie nur.

Z
zeenqah Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren

Ich habe die Methoden ja in den über den Codebeispielen stehenden Klassen.
Ich frage mich, wie ich die ganze Anwendung samt allen Fenstern über eine einzige Funktion, die durch ein Buttonevent ausgelöst wird, beenden kann.

J
251 Beiträge seit 2012
vor 8 Jahren

Wie wäre es wenn man statt ein neues Fenster "Uebersicht" zu erzeugen, das Bestehende wieder sichtbar macht, welches man selbst versteckt hat?

Z
zeenqah Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren

Ja aber irgendwie muss ich doch auf die andere Klasse zugreifen können? Ich hab ein Übersichtsfenster mit Klasse Uebersicht.xaml.cs und das AuftragsAnlegenfenster mit Klasse AuftragAnlegen.xaml.cs, wie soll ich sonst ein Fenster erzeugen, das das Layout von AuftragAnlegen.xaml übernimmt und von Uebersicht ausgeht?

Edit: Das Uebersicht Fenster_Uebersicht = new Uebersicht(); soll mich ja nur auf die Attribute von Uebersicht zugreifen lassen, es handelt sich ja dabei um eine Klasse, und static ist sie nicht.

5.658 Beiträge seit 2006
vor 8 Jahren

Hi zeenqah,

vielleicht wäre es einfacher und effektiver, sich erstmal ein bißchen mit den Grundlagen zu beschäftigen. Du gehst offenbar davon aus, daß du der erste bist, der dieses Problem hat. Aber wenn man mal kurz bei Google schaut, stellt man schnell fest, daß es schon vor dir andere Leute gelöst haben, und zwar auf unterschiedliche Weise.

Einerseits könntest du dir beim Erzeugen der Fenster merken, welche Fenster noch offen bzw. noch vorhanden sind, und beim Schließen des Hauptfensters diese Fenster dann mit schließen. Dabei solltest du aber auch die anderen o.g. Hinweise ernst nehmen und unterscheiden zwischen Fenster "schließen" und "verstecken".

Andererseits könntest du einfach Application.Current.Shutdown() verwenden (bei mir erstes Suchergebnis bei Google).

Eine weitere Möglichkeit wäre, auf mehrere Fenster zu verzichten und stattdessen alle Views in einem Fenster unterzubringen und bei Bedarf zwischen den Views umschalten. Dann sieht alles wesentlich übersichtlicher aus, und es ergeben sich keine Probleme mit evtl. offenen Fenstern.

Christian

Weeks of programming can save you hours of planning

709 Beiträge seit 2008
vor 8 Jahren

Eine weitere Möglichkeit wäre die Nutzung eines Messengers und eine entsprechende Nachricht beim Beenden zu senden und dann beim Eintreffen einer solchen Nachricht die Fenster zu schließen.

Z
zeenqah Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren

Kann man nicht auch mit Seiten arbeiten?
Wie ruft man diese dann im Programm auf?

2.207 Beiträge seit 2011
vor 8 Jahren

Hast du überhaupt mal das von Sparkle erwähnte "Application.Current.Shutdown() " probiert?

Z
zeenqah Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren

Das hab ich probiert, finde die Funktion nicht. Ich habe eine Weile nach dem Namespace für die Funktion gesucht, aber aufgegeben. Dann hab ich Environment.Exit(); gefunden, das hat Abhilfe geschaffen. Trotzdem ist es ein Problem, wenn ich das Fenster aus der Taskleiste schließe.
Dann läuft der Prozess weiter, die Fenster sind weg. Ich wüsste schon, dass es ein Event für geschlossene Fenster gibt, allerdings weiß ich nicht wie und wo ich das praktisch einsetzen bzw hinschreiben sollte.

F
10.010 Beiträge seit 2004
vor 8 Jahren

Dein Problem ist, das du keinen blassen schimmer hast,w as du da überhaupt machst.

Das Uebersicht Fenster_Uebersicht = new Uebersicht(); soll mich ja nur auf die Attribute von Uebersicht zugreifen lassen, es handelt sich ja dabei um eine Klasse, und static ist sie nicht.

Davon das du eine neues Fenster auf machst, bekommst du keinen Zugriff auf das alte.

Versuch doch erst zu verstehen was du da machst bevor du irgendwas rumfrickelst.

Wenn du ein Modalen Dialog machen willst ( gibt es für und wieder ) dann mach das auch ( ShowDialog ).
Hier wartet dann dein "Uebersicht" Fenter und du kannst das SELBE Fenster im Anschluss wieder sichtbar machen.

Noch einmal, versuch zu verstehen was du machst, und was z.b. NEW macht.

5.658 Beiträge seit 2006
vor 8 Jahren

Das hab ich probiert, finde die Funktion nicht. Ich habe eine Weile nach dem Namespace für die Funktion gesucht, aber aufgegeben..

Wenn du so arbeitest, ist jeder Versuch dir zu helfen, von vornherein zum Scheitern verurteilt. Daher ist jetzt hier zu.

Christian

Weeks of programming can save you hours of planning

Thema geschlossen