Close MainWindow


drpingoo

Erfahrenes Mitglied
#1
Hallo zusammen,

Ich habe eine Frage zum MainWindow-Schliessen. Ich möchte das MainWindow schliessen, wenn ein gewisses Event in einer anderen Klasse stattgefunden hat (Der Einfachheit halber als Bsp wird hier einfach die Fkt TestFunction() aufgerufen und damit hat sichs). Leider schliesst das MainWindow bei mir nicht, sondern das Programm läuft einfach weiter. Ich hab mal kurz grob programmiert, wie das in etwa aussehen soll, um euch nicht mit dem ganzen Code aus dem eigtl Projekt zuzubombadieren. Wenn ich hier this.Close aufrufe, bekomme ich folgende InvalidOperationException: Visibility kann nicht auf "Visible" festgelegt und Show, ShowDialog, Close oder WindowInteropHelper.EnsureHandle können nicht aufgerufen werden, während ein Window geschlossen wird

Mein Code:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Closing
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    /// 

    

    public partial class MainWindow : Window
    {
        Test test = new Test();
        public MainWindow()
        {
            InitializeComponent();
            test.SetWindow(this);
            test.testEvent += new System.ComponentModel.CancelEventHandler(CloseWindow);
            while (true)
            {
                test.TestFunction();
            }
            
        }

        private void CloseWindow(object sender, System.ComponentModel.CancelEventArgs e)
        {
            this.Close();
        }
    }


    public class Test
    {
        public event System.ComponentModel.CancelEventHandler testEvent;
        public MainWindow window;

        public void TestFunction()
        {

            testEvent(window, new System.ComponentModel.CancelEventArgs());
        }

        public void SetWindow(MainWindow win)
        {
            window = win;
        }
    }
}
HTML:
<Window x:Class="Closing.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Closing="CloseWindow">
    <Grid>

    </Grid>
    
    
</Window>
Ich hoffe, ihr könnt mir weiterhelfen.
Danke
 

ZnO

Grünschnabel
#2
Hallo,

versuch mal folgendes:

Code:
public partial class MainWindow : Window
    {
        Test test = new Test();
        private bool _isShutDown =true;

        public MainWindow()
        {
            InitializeComponent();
            test.SetWindow(this);
            test.TestEvent += new System.ComponentModel.CancelEventHandler(CloseWindow);
          
            Loaded += MainWindow_Loaded;
            
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            while (_isShutDown)
            {
                test.TestFunction();
            }
        }
 
        private void CloseWindow(object sender, System.ComponentModel.CancelEventArgs e)
        {
            _isShutDown = false;
            this.Close();

        }
    }
    public class Test
    {
        public event System.ComponentModel.CancelEventHandler TestEvent;
        public MainWindow Window;

        public void TestFunction()
        {

            TestEvent(Window, new System.ComponentModel.CancelEventArgs());
        }

        public void SetWindow(MainWindow win)
        {
            Window = win;
        }
    }
was ich gemacht habe ist ich hab ein Flag beim Aufruf des Events gesetzt, welches die While-Schleife unterbricht und damit die Anwendung beendet. Wenn du das ganze noch sicherer machen willst dann kannst du die Methode Close auch nach der While-Scheife aufrufen statt im Event Handler.
 

drpingoo

Erfahrenes Mitglied
#3
Hoi,

Danke, für die Antwort. Ich habs ausprobiert. Jedoch erhalte ich in der CloseWindow-Function eine Exception, wenn das Programm versucht this.Close() aufzurufen. Die Exception war folgende: Visibility kann nicht auf "Visible" festgelegt und Show, ShowDialog, Close oder WindowInteropHelper.EnsureHandle können nicht aufgerufen werden, während ein Window geschlossen wird. Ist das bei dir nicht passiert? Oder hast du/ihr eine Idee, woran das liegen könnte?

Danke und Gruss
drpingoo
 

ZnO

Grünschnabel
#4
Hi

Ich hab versucht den Fehler zu konstruieren leider erfolglos bei mir unter Visual Studio 2012 mit .Net 4.0 als WPF Project funktioniert mein Code einwandfrei.
Der Fehler kommt normalerweise, wenn man versucht das Fenster mehrmals zu schließen.

Um sicherzustellen das es nur einmal geschlossen wird kannst du das Closing Event abonieren und dort dann einfach mal ne Breakpoint reinsetzten und gucken wie oft diese aufgerufen wird.

Hi,

kann es sein, dass du in deiner Anwendung versuchst ein Fenster zu schließen und dannach wieder anzuzeigen ? Also quasi sowas machst:
Window.Show();
Window.Close();
Window.Show();
Denn in diesem Fall würde die Exception fliegen.
 

drpingoo

Erfahrenes Mitglied
#5
Hallo,

Das Problem war tatsächlich, dass ich das Window 2x schliessen wollte. Ich hatte ja im HTML Code zusätzlich noch folgende Line drin : Closing="CloseWindow". Als ich dann this.Close() aufgerufen habe, bin ich nochmals in die CloseWindow-Function gesprungen. Es hat sowohl funktioniert als ich this.Close() rausgenommen hab, als auch als ich die Line Closing = ClosingWindow entfernt habe.


Danke vielmals!
 
Zuletzt bearbeitet: