你怎么知道一个WPF窗口是否closures?
我正在处理一个应用程序,显示一些可以由用户closures或自动closures的子窗口。 在debugging一些正在抛出的exception的同时,我发现我正试图在已经closures的窗口上调用像Hide()
这样的方法。 这个特殊的代码分支对于这两种情况都是通用的,我没有注意到这一点。
我的第一个想法之一是在Window
上寻找一个属性,表明窗口已经closures。 我似乎无法find一个。 在WinForms中,我会寻找IsDisposed属性来指示表单已被closures(它不会可靠地用于对话框,但我不用对话框工作)。我没有看到任何等效的东西Window
。 Window.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。