在app关闭时获取窗口可见性

时间:2016-08-10 09:44:36

标签: c# .net wpf

我有一个应用程序,它有一个主窗口和许多子窗口。我希望能够获得子窗口的可见性,并在用户关闭应用程序时保存它。

我尝试的事件如下

问题在于它们按以下顺序调用

  1. ChildWindow.VisibleChanged
  2. ChildWindow.Closing
  3. ChildWindow.Closed
  4. MainWindow.Closing
  5. MainWindow.Closed
  6. Application.Exit
  7. 因此,当应用程序存在或主窗口关闭时,所有子窗口都是不可见的,并且我无法知道用户是否打开了它们。

    我应该听一个不同的事件或以不同的方式去做吗?

    更新

    我设法在一个空的wpf应用程序中重现它。

    public partial class MainWindow : Window
    {
        Window dummyWindow = new Window();
        public MainWindow()
        {
            Application.Current.MainWindow = this;
            InitializeComponent();
            this.Loaded += MainWindow_Loaded;
            this.IsVisibleChanged +=(s,ev) => Debug.WriteLine("Main visiblity changed");
            this.Closing +=(s,ev) => Debug.WriteLine("Main closing");
            this.Closed +=(s,ev) => Debug.WriteLine("Main closed");
            Application.Current.Exit +=(s,ev) => Debug.WriteLine("App exit");
        }
    
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
    
            dummyWindow.Show();
            dummyWindow.Owner = this;
            dummyWindow.IsVisibleChanged += (s,ev) => Debug.WriteLine("Dummy visiblity changed");
            dummyWindow.Closing += (s,ev) => Debug.WriteLine("Dummy closing");
            dummyWindow.Closed += (s,ev) => Debug.WriteLine("Dummy closed");
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.Shutdown();
        }
    }
    

2 个答案:

答案 0 :(得分:0)

您需要在程序关闭时保存程序的状态。

您可以序列化ViewModel并将其保存在磁盘上,然后在重新启动程序时再次加载它。

答案 1 :(得分:0)

显然会发生这种情况,因为当应用程序关闭时,WPF关闭窗口的顺序是创建它们的顺序,它不会先关闭var arrayCollection = new A[] { new A { textField = "HELLO" }, new A { textField = "WORLD" } }; 。 看看DoShutdown方法。

如果是我的情况,第一个窗口是MainWindow,因为初始化程序在dummyWindow的构造函数之前运行,这意味着MainWindow的基本构造函数首先被调用adds the window to the Application.WindowsInternal list

解决此问题的最简单方法是确保在构造dummyWindow之后构建任何其他子窗口。