你怎么知道一个WPF窗口是否closures?

我正在处理一个应用程序,显示一些可以由用户closures或自动closures的子窗口。 在debugging一些正在抛出的exception的同时,我发现我正试图在已经closures的窗口上调用像Hide()这样的方法。 这个特殊的代码分支对于这两种情况都是通用的,我没有注意到这一点。

我的第一个想法之一是在Window上寻找一个属性,表明窗口已经closures。 我似乎无法find一个。 在WinForms中,我会寻找IsDisposed属性来指示表单已被closures(它不会可靠地用于对话框,但我不用对话框工作)。我没有看到任何等效的东西WindowWindow.Close()的文档似乎没有指出任何由该方法更改的属性。 我是否错过了一些显而易见的东西,或者是唯一一个知道窗口是否被closures来处理Closed事件的方法? 这似乎是一个简单的任务苛刻的要求。

根据MSDN WPF论坛上的这个对话 (请参阅最后一篇文章),您可以检查IsLoaded是否为false,这意味着该窗口可以“卸载”其内容。 我希望这对你有用!

另一种方法: Application.Windows包含打开的窗口列表。 你可以检查这个集合是否包含你的窗口(它在closures后被删除)。

看起来你必须调用OfType<Window>()因为它是一个专门的集合。

希望这对你有用:

PresentationSource.FromVisual(window)== null;

我不知道为什么IsDisposed属性是内部的,但如果你不害怕reflection:

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

这就是说,反思不会被过度使用,因为你不再受到类的公共API的保护。 如果你走这条路线,至less要使用unit testing。

我的解决scheme是简单地将一个事件附加到对话框的Closed事件:

 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... . . . } 

如果你从Window类派生,你可以这样做:

 public bool IsClosed { get; private set; } protected override void OnClosed(EventArgs e) { base.OnClosed(e); IsClosed = true; } 

它比注册closures事件有优势 – 无需取消注册callback。