在应用程序关闭时获得windows可见性

本文关键字:windows 可见性 应用程序 | 更新日期: 2023-09-27 18:01:34

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

我尝试的事件如下

  • Window.Closing
  • Window.Closed
  • Aplication.Exit
  • UIElement.IsVisibleChanged

问题是它们是按以下顺序调用的

  1. ChildWindow.VisibleChanged
  2. ChildWindow.Closing
  3. ChildWindow.Closed
  4. MainWindow.Closing
  5. MainWindow.Closed
  6. Application.Exit

所以当应用程序存在或主窗口关闭时,所有的子窗口都是不可见的,我没有办法知道用户是否打开了它们。

我应该听一个不同的事件或者有不同的方法来做吗?

我已经成功地在一个空的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();
    }
}

在应用程序关闭时获得windows可见性

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

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

显然,这是因为当应用程序关闭时,WPF关闭窗口的顺序是创建窗口的顺序,它不会首先关闭MainWindow。看看DoShutdown方法。

在我的例子中,第一个窗口是dummyWindow,因为初始化器在MainWindow的构造函数之前运行,这意味着dummyWindow的基本构造函数首先被调用,从而将窗口添加到Application.WindowsInternal列表中。

解决这个问题最简单的方法是确保任何其他子窗口的构造都发生在MainWindow的构造之后。