我正在开发一个显示一些子窗口的应用程序,这些窗口可以由用户关闭或自动关闭 . 在调试一些被抛出的异常时,我发现我试图在已经关闭的窗口上调用 Hide()
之类的方法;这个特殊的代码分支在两种情况下都很常见,我没有注意到这一点 .
我的第一个想法之一就是在 Window
上查找一个表明窗口已经关闭的属性 . 我可以查看IsDisposed属性以获得表格已经关闭的某种可靠指示(它赢得了't reliably work for a dialog but I' m不使用对话框 . )我在 Window
上看不到任何等价物 . Window.Close()
没有't seem to indicate any properties that are changed by the method. Am I missing something obvious, or is the only method to know if a window'的文档被关闭以处理 Closed
事件?这对于简单的任务来说似乎是一种苛刻的要求 .
7 回答
根据MSDN WPF论坛上的this conversation(参见上一篇文章),您可以检查IsLoaded是否为false,这意味着窗口是"eligible"用于卸载其内容 . 我希望这对你有用!
如果从Window类派生,则可以执行以下操作:
它比注册Closed事件更有优势 - 无需取消注册回调 .
另一种方式:Application.Windows包含一个打开的窗口列表 . 您可以检查此集合是否包含您的窗口(关闭后将其删除) .
看起来你必须调用
OfType<Window>()
因为它是一个专门的集合 .我不知道为什么IsDisposed属性是内部的,但是如果你不害怕反思:
话虽如此,反思不会被滥用,因为你不再受到类的公共API的保护 . 如果你走那条路,一定要至少使用单元测试 .
希望这对你有用:
PresentationSource.FromVisual(window)== null;
我的解决方案是简单地将事件附加到对话框的
Closed
事件:您可以向WindowClass
bool IsClosed
添加非静态属性,并在Closed
事件上设置true: