it-swarm.com.de

Wie können Sie feststellen, ob ein WPF-Fenster geschlossen ist?

Ich arbeite an einer Anwendung, die einige untergeordnete Fenster anzeigt, die entweder vom Benutzer geschlossen werden können oder automatisch geschlossen werden. Beim Debuggen einiger Ausnahmen, die ausgelöst wurden, stellte ich fest, dass ich versuchte, Methoden wie Hide() in einem bereits geschlossenen Fenster aufzurufen. Dieser spezielle Teil des Codes war in beiden Fällen üblich, und ich hatte dies nicht bemerkt.

Eine meiner ersten Ideen war, nach einer Eigenschaft in Window zu suchen, die darauf hinweist, dass das Fenster geschlossen wurde. Ich kann scheinbar keinen finden. In WinForms würde ich die IsDisposed - Eigenschaft nach einem etwas zuverlässigen Indikator suchen, dass das Formular geschlossen wurde (es funktioniert nicht zuverlässig für einen Dialog, aber ich arbeite nicht mit Dialogen.) Ich nicht etwas Äquivalentes auf Window sehen. Die Dokumentation für Window.Close() scheint keine Eigenschaften anzugeben, die von der Methode geändert werden. Fehlt mir etwas offensichtliches oder ist die einzige Methode, zu wissen, ob ein Fenster geschlossen wurde, um das Ereignis Closed zu behandeln? Das scheint eine harte Anforderung für eine einfache Aufgabe zu sein.

49
OwenP

Laut dieser Konversation in den MSDN WPF-Foren (siehe letzter Beitrag) können Sie prüfen, ob der IsLoaded-Wert false ist. Dies bedeutet, dass das Fenster zum Entladen des Inhalts "berechtigt" ist. Ich hoffe das funktioniert für dich!

52
scwagner

Wenn Sie von der Window-Klasse abgeleitet sind, können Sie Folgendes tun:

public bool IsClosed { get; private set; }

protected override void OnClosed(EventArgs e)
{
    base.OnClosed(e);
    IsClosed = true;
}

Es hat einen Vorteil gegenüber der Registrierung für das Closed-Ereignis - es ist nicht erforderlich, den Rückruf zu deaktivieren.

9
Tom

Eine andere Möglichkeit: Application.Windows enthält eine Liste der geöffneten Fenster ..__ Sie können überprüfen, ob diese Sammlung Ihr Fenster enthält (es wird nach dem Schließen entfernt).

Anscheinend müssen Sie OfType<Window>() aufrufen, da es sich um eine spezialisierte Sammlung handelt.

7
Simon_Weaver

Ich weiß nicht, warum die IsDisposed - Eigenschaft intern ist, aber wenn Sie keine Reflexion fürchten: 

var window = new Window();
var propertyInfo = typeof(Window).GetProperty("IsDisposed", BindingFlags.NonPublic | BindingFlags.Instance);
var isDisposed = (bool)propertyInfo.GetValue(window);

Allerdings darf Reflektion nicht überlastet werden, da Sie nicht mehr durch die öffentliche API der Klasse geschützt sind. Stellen Sie sicher, dass Sie mindestens Komponententests verwenden, wenn Sie diese Route wählen.

5
Adrian Rus

Hoffe das ist nützlich für dich:

PresentationSource.FromVisual (Fenster) == null;

4
dexiang

Meine Lösung bestand darin, einfach ein Ereignis an das Closed-Ereignis des Dialogs anzuhängen:

MikesDialog dlg = new MikesDialog();
dlg.Closed += delegate
{
    //  The user has closed our dialog.
    validationgDlg = null;
};

//  ...elsewhere in the code...

if (validationgDlg != null)
{
     //  Our "MikesDialog" is still open...
     . . .
}
4
Mike Gledhill

Sie können der WindowClass bool IsClosed eine nicht statische Eigenschaft hinzufügen und das Ereignis Closed auf true setzen:

public partial class MyWindow : Window
{
    public bool IsClosed { get; set; } = false;
    public MyWindow()
    {
        Closed += MyWindow_Closed;
        InitializeComponent();
    }
}    

private void MyWindow_Closed(object sender, EventArgs e)
{
   IsClosed = true;
}
0
Mayer Spitzer