C# WPF中如何通过确认弹窗关闭自身及主窗口
问题根因
你当前代码无效的核心原因是:new Mainwindow()创建的是一个全新的主窗口对象实例,和屏幕上已经打开、正在运行的主窗口完全是两个独立对象,且这个新实例从未被调用Show()方法加载到界面,调用它的Close()方法自然对正在运行的主窗口没有任何影响。
可直接使用的实现方案
以下三种方案按场景选择即可:
方案1:快速实现,直接获取全局主窗口实例
WPF 全局应用对象Application.Current已经持有当前运行的主窗口引用,不需要手动新建实例,在确认窗口的「是」按钮点击事件中写如下代码即可:private void YesButton_Click(object sender, RoutedEventArgs e) { // 先关闭当前确认弹窗 this.Close(); // 关闭已经打开的主窗口 Application.Current.MainWindow.Close(); }方案2:传参实现,适配自定义主窗口场景
如果你在应用运行过程中手动切换过主窗口,担心全局MainWindow引用不准,可以在弹窗时把主窗口实例当参数传入:- 先修改确认窗口的后台代码,增加接收主窗口对象的构造函数:
public partial class ExitConfirmWindow : Window { private readonly Window _targetMainWin; // 构造函数接收主窗口实例 public ExitConfirmWindow(Window mainWin) { InitializeComponent(); _targetMainWin = mainWin; } private void YesButton_Click(object sender, RoutedEventArgs e) { this.Close(); _targetMainWin.Close(); } }- 在主窗口监听ESC按键、弹出确认窗的代码中,把当前主窗口自身作为参数传入:
private void MainWindow_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Escape) { // 传入当前主窗口实例this var confirmWin = new ExitConfirmWindow(this); confirmWin.ShowDialog(); } }方案3:直接退出整个应用(逻辑最简单)
如果你的业务逻辑是用户点确认后直接退出整个程序,不需要保留其他窗口,直接调用全局退出方法即可,不需要单独处理两个窗口的关闭逻辑:private void YesButton_Click(object sender, RoutedEventArgs e) { // 关闭应用所有窗口,直接终止进程 Application.Current.Shutdown(); }
优化建议:如果想降低窗口之间的耦合度,可以用模态对话框的返回值实现逻辑分离:给确认窗的「是」按钮设置
DialogResult = true,主窗口调用ShowDialog()后判断返回值,为true时主窗口自己执行Close()即可,确认窗不需要持有主窗口的任何引用,复用性更强。
内容的提问来源于stack exchange,提问作者Anosh Younas
相关产品推荐
相关产品推荐

