C# 关闭第一个窗口中生成的第二个窗口';s代码

C# 关闭第一个窗口中生成的第二个窗口';s代码,c#,wpf,windows,C#,Wpf,Windows,我正在用C#编写一个WPF应用程序,它有一个主窗口,其中有一个名为“Login”的按钮。如果您单击它,将出现第二个带有登录表单的窗口。如果单击登录窗口中的“取消”按钮,我希望登录窗口关闭,并返回主窗口 这就是我想出的解决办法。但是,由于登录窗口的实例是在主窗口的方法ButtonLogin_Click()内创建的,并且由于登录窗口的方法ButtonCancel_Click()只会关闭它,如果我再次单击主窗口中的“Login”按钮会发生什么?登录窗口的现有实例是否会再次显示,还是每次单击按钮时它都会

我正在用C#编写一个WPF应用程序,它有一个主窗口,其中有一个名为“Login”的按钮。如果您单击它,将出现第二个带有登录表单的窗口。如果单击登录窗口中的“取消”按钮,我希望登录窗口关闭,并返回主窗口

这就是我想出的解决办法。但是,由于登录窗口的实例是在主窗口的方法ButtonLogin_Click()内创建的,并且由于登录窗口的方法ButtonCancel_Click()只会关闭它,如果我再次单击主窗口中的“Login”按钮会发生什么?登录窗口的现有实例是否会再次显示,还是每次单击按钮时它都会创建一个新实例(这显然不是我想要的,因为如果单击登录按钮n次,我将拥有n个登录窗口实例)?最好的方法是什么

MainWindow.xaml.cs:

namespace TestTwoWindows
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonLogin_Click(object sender, RoutedEventArgs e)
        {
            Login LoginWindow = new Login();
            LoginWindow.Show();
        }
    }
}
Login.xaml.cs:

namespace TestTwoWindows
{
    public partial class Login : Window
    {
        public Login()
        {
            InitializeComponent();
        }

        private void ButtonCancel_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}

你不应该关窗户。保留实例并设置其可见性。换句话说,使用这种方法:

    Login LoginWindow;
    private void ButtonLogin_Click(object sender, RoutedEventArgs e)
    {
        if (LoginWindow == null)
        {
            LoginWindow = new Login();
            LoginWindow.Closing += LoginWindow_Closing;
            LoginWindow.Show();
        }
        else
            LoginWindow.Visibility = Visibility.Visible;
    }

    private void LoginWindow_Closing(object sender, CancelEventArgs e)
    {
        e.Cancel = true;
        ((Window)sender).Visibility = Visibility.Hidden;
    }

以模态方式打开窗口:

LoginWindow.Show()->
LoginWindow.ShowDialog()


在LoginWindow关闭之前,MainWindow将不可访问

除了模式对话框之外,您还可以检查空值并将窗口声明在事件处理程序的范围之外

我认为当您再次单击按钮或取消登录后再次打开登录窗口时,最好重新激活登录窗口

    LoginWindow LoginWindow;
    private void ButtonLogin_Click(object sender, RoutedEventArgs e)
    {
        if (LoginWindow == null)
        {
            LoginWindow = new LoginWindow();
            LoginWindow.Closed += Window_Closed;
            LoginWindow.Show();
        } else
        {
            LoginWindow.Activate();
        }
    }
并在关闭时再次将其设置为null

    private void Window_Closed(object sender, EventArgs e)
    {
        LoginWindow = null;
    }

以模态方式打开窗口:
LoginWindow.Show()->
LoginWindow.ShowDialog()。在登录窗口关闭之前,无法访问主窗口closed@user5226582,单音在这里不好用。用例:单击登录-单击取消-再次单击登录。在每次登录点击时创建两次窗口会更有意义我一直在考虑隐藏而不是关闭这会引发异常。您应该更改可见性。查看我的答案。@logithack如果您对此有任何问题,请告诉我。这也必须有效(在编辑之前,我指的是答案)。thanks@user1892538你能给我解释一下LoginWindow.Closed+=Window\u Closed;做我知道+=运算符将前面的值加上后面的值,但是在您的代码中,函数调用窗口\u Closed似乎被添加到LoginWindow.Closed?我以前从未见过,所以如果你能帮我一点忙,我会很高兴的!谢谢你的回复,我想这就是我一直在寻找的!
+=
运算符还用于指定将在响应事件时调用的方法;此类方法称为事件处理程序。在这个上下文中使用+=操作符被称为订阅事件。这看起来就像我在寻找的一样。然而,我对C#中的GUI编程还没有那么丰富的经验。你能给我解释一下什么是LoginWindow.Closing+=LoginWindow\u Closing;什么事?非常感谢。通过谷歌搜索wpf中的事件处理,您可以找到更多信息