首页 文章

如何判断WPF窗口是否已关闭?

提问于
浏览
49

我正在开发一个显示一些子窗口的应用程序,这些窗口可以由用户关闭或自动关闭 . 在调试一些被抛出的异常时,我发现我试图在已经关闭的窗口上调用 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 回答

  • 7

    根据MSDN WPF论坛上的this conversation(参见上一篇文章),您可以检查IsLoaded是否为false,这意味着窗口是"eligible"用于卸载其内容 . 我希望这对你有用!

  • 4

    如果从Window类派生,则可以执行以下操作:

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

    它比注册Closed事件更有优势 - 无需取消注册回调 .

  • 9

    另一种方式:Application.Windows包含一个打开的窗口列表 . 您可以检查此集合是否包含您的窗口(关闭后将其删除) .

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

  • 4

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

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

    话虽如此,反思不会被滥用,因为你不再受到类的公共API的保护 . 如果你走那条路,一定要至少使用单元测试 .

  • 50

    希望这对你有用:

    PresentationSource.FromVisual(window)== null;

  • 5

    我的解决方案是简单地将事件附加到对话框的 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...
         . . .
    }
    
  • 0

    您可以向WindowClass bool IsClosed 添加非静态属性,并在 Closed 事件上设置true:

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

相关问题