You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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引用不准,可以在弹窗时把主窗口实例当参数传入:

    1. 先修改确认窗口的后台代码,增加接收主窗口对象的构造函数:
    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();
        }
    }
    
    1. 在主窗口监听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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:57:27