当前位置: 首页 > 编程语言 > C#

为什么Window.Close事件会传播?分享

时间:2023-04-10 22:52:14 C#

为什么Window.Close事件会传播?我遇到了一种奇怪的情况,子窗口的Close事件传播到父窗口并导致它关闭。我做了一个最小的例子,如下所示对于TestWindow,只有VS在App.xaml.cs中生成的默认WPF窗口我重写了OnStartup事件并将其用作自定义Main函数protectedoverridevoidOnStartup(StartupEventArgse){base.OnStartup(e);测试窗口t=new测试窗口();t.ShowDialog();现在,如果您单击X按钮关闭TestWindow,应用程序将关闭而不是显示MainWindow。如果您注释掉t.ShowDialog,那么MainWindow将正常显示。接下来,如果您收听MainWindow的Closing事件,您会看到它在TestWindow关闭后触发,这对我来说似乎不正确,因为它实际上没有传播,WPF运行您的第一个对话框,并在关闭时收到通知,该过程没有进一步的窗口。WPF发布应用程序退出消息供以后处理。与此同时,您的代码继续显示另一个窗口,在处理消息泵时遇到退出消息,因此关闭窗口并终止您的应用程序。调试日志:信息:0:应用程序启动信息:0:新主窗口信息:0:主窗口关闭信息:0:应用程序已退出要解决此问题,您需要删除StartupUri并改为处理启动事件。更改:......至:然后丢弃OnStartup上的代码,改为为Startup定义一个处理程序://protectedoverridevoidOnStartup(StartupEventArgse)//{//base.OnStartup(e);////测试窗口t=new测试窗口();//t.ShowDialog();//}privatevoidApplication_Startup(objectsender,StartupEventArgse){varmain=newMainWindow();测试窗口t=new测试窗口();t.ShowDialog();主要显示();以前我能够确认MainWindow是在对话框关闭后创建的;加载和关闭快速连续。应用程序在这里的工作方式是第一个启动的窗口被选为主窗口。因此,在您的情况下,将选择TestWindow作为主窗口。ShutdownMode在代码中以某种方式设置为OnMainWindowClose。因此,在关闭TestWindow时,所有子窗口(包括您的MainWindow)都将触发Closing。所以这里的问题不是传播,而是end事件中的传播。在主窗口实际首先启动之前,不应创建任何窗口。或者,如果需要,您可以将ShutdownMode设置为OnLastWindowClose。protectedoverridevoidOnStartup(StartupEventArgse){base.OnStartup(e);Application.Current.ShutdownMode=ShutdownMode.OnLastWindowClose;测试窗口t=new测试窗口();t.ShowDialog();在函数中显式设置MainWindow:publicMainWindow(){InitializeComponent();Application.Current.MainWindow=这个;但是,如果您使用ShowDialog(),则不能显式设置MainWindow。因为在关闭TestWindow时(当它仍然是主窗口时),整个应用程序将被关闭。编辑:我没有找到任何对此的引用,但可以检查它,我们可以确定这是调试:以上是C#学习教程:WhydoestheWindow.Closeeventpropagate?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——protectedoverridevoidOnStartup(StartupEventArgse){base.OnStartup(e);newTestWindow();//甚至不需要显示varwm=Application.Current.MainWindow;//指向新的TestWindow//如果这里没有任何Windowinit,MainWindow就是null}本文收集来自网络,不代表立场,如有侵权请点击右边联系管理员删除。如需转载请注明出处: