【问题标题】:WPF close all window from the main windowWPF 从主窗口关闭所有窗口
【发布时间】:2013-07-19 07:03:44
【问题描述】:

我有登录窗口。在这个登录窗口中,我正在初始化主窗口。 登录成功后,我关闭登录窗口。 现在我有另外两个窗口,我从主窗口调用它们。 一旦我关闭主窗口,我就可以关闭其他两个窗口以及主窗口。 但是程序仍然在内存中运行。我必须从 Visual Studio 手动关闭它。 我应该如何完全关闭程序所有实例? 这是主窗口关闭事件代码。

private void usimClose(object sender, EventArgs e)
{
   newScreen2.Close();
   newScreen3.Close();  
   this.Close();                        
}

这是我的登录窗口代码。一旦用户点击提交按钮。

 private void btnLogin_Click(object sender, RoutedEventArgs e)
 {
        if (txtUserName.Text.Length == 0)
        {
            errormessage.Text = "Please Enter UserName";
            txtUserName.Focus();
        }
        else
        {                
            LoginStatus _status = _Login.LoginUsimgClient(txtUserName.Text, txtPassword.Password.ToString());

            if (_status.BoolLoginstatus)
            {
                mainWindow.RunApplication();
                string struserName = _status.StringUserFirstName;
                mainWindow.userName.Text = "Welcome " + struserName;
                mainWindow.Show();
                this.Close();                    
            }
            else
            {
                errormessage.Text = _status.StringErrorDescription;
                txtUserName.Text = String.Empty;
                txtPassword.Password = String.Empty;
            }
        }
}

【问题讨论】:

  • 我认为 mainWindow 是您的登录窗口的属性,因此它将登录窗口保存在内存中
  • 是的。我认同。那我该怎么解决呢?
  • 而不是关闭它,如果我隐藏我的登录窗口 this.Visibility = System.Windows.Visibility.Hidden;但是从主窗口我应该如何关闭登录窗口?
  • 尝试在应用的 OnStartup 事件中显示和处理您的登录内容
  • 如果我知道您的主窗口是登录窗口的成员,那是不正确的。您应该在启动事件时在 App 类中创建登录窗口,并在登录功能完成后实例化主窗口并显示它。其他窗口模式/不应该将主窗口作为父窗口,以便在主窗口关闭时收集它们。

标签: c# wpf xaml


【解决方案1】:

试试Application.Current.Shutdown();

来自MSDN

显式调用 Shutdown 会导致应用程序关闭, 无论 ShutdownMode 设置如何。但是,如果 ShutdownMode 是 设置为 OnExplicitShutdown,您必须调用 Shutdown 来关闭 应用。

重要提示

当调用 Shutdown 时,应用程序将关闭而不管 是否取消任何打开的窗口的关闭事件。

这个方法只能从创建的线程调用 应用程序对象。

【讨论】:

    【解决方案2】:

    您可以使用此关闭所有窗口

    App.Current.Shutdown();
    

    你可以手动关闭它

    Window parentwin = Window.GetWindow();
    parentwin.Close();
    

    【讨论】:

    • 有一些 ForeGroundThread 在其他窗口中运行。我关闭了它们。现在我可以关闭所有窗口。谢谢
    【解决方案3】:

    如果你的起点是你的 MainWindow,那么就从那里开始。

    首先,在 MainWindow 中托管 LoginForm,并使用 ShowDialog() 强制用户与 LoginForm 交互。将成功/不成功交互的结果返回给 MainForm。

        private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
        {
            var form = new LoginForm();
            var result = form.ShowDialog();
    
            if (result ?? false)
            {
                // Carry on opening up other windows
            }
            else
            {
                // Show some kind of error message to the user and shut down
            }
        }
    

    否则,从技术上讲,您的 LoginForm 正在托管您的 MainForm,坦率地说,这很奇怪。

    【讨论】:

      【解决方案4】:

      在这里看看我的回答:How to close wpf window from another project

      Application.Current.Shutdown() 将以非常突然的方式停止应用程序。

      最好优雅地跟踪窗口并关闭它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-08
        • 2012-10-10
        • 1970-01-01
        • 2014-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多