我有一个应用程序,它有一个主窗口和许多子窗口。我希望能够获得子窗口的可见性,并在用户关闭应用程序时保存它。
我尝试的事件如下
问题在于它们按以下顺序调用
ChildWindow.VisibleChanged
ChildWindow.Closing
ChildWindow.Closed
MainWindow.Closing
MainWindow.Closed
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();
}
}
答案 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
之后构建任何其他子窗口。