关闭在第一个窗口的代码中生成的第二个窗口
问题描述:
我正在用C#编写一个WPF应用程序,它有一个名为“Login”的按钮的主窗口。如果您点击它,将会出现一个带登录表单的第二个窗口。如果我点击登录窗口中的“取消”按钮,我想登录窗口关闭,我想返回到主窗口。关闭在第一个窗口的代码中生成的第二个窗口
这是我想出的解决方案。但是,由于Login窗口的实例是在主窗口的ButtonLogin_Click()方法内部创建的,并且由于登录窗口的ButtonCancel_Click()方法只有this.Close(),所以如果单击“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();
}
}
}
答
除了模态对话框>LoginWindow.ShowDialog();
主窗口将不可访问,您可以检查空值并将该窗口声明在事件处理程序的范围之外。
我认为这将是更好的重新登录窗口,当你在按钮上再次单击或取消登录
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();
}
}
后再次打开它,将其设置为再次空闭
private void Window_Closed(object sender, EventArgs e)
{
LoginWindow = null;
}
时
答
你不应该关闭该窗口。保持实例并设置其可见性。换句话说,使用这种方法:
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.Show();' - >'LoginWindow.ShowDialog();'。 MainWindow将无法访问,直到LoginWindow关闭 – ASh
[相关](https://stackoverflow.com/questions/6320393/how-to-create-a-class-which-can-only-have-a-single-instance-in -c-sharp) – user5226582
@ user5226582,singletone在这里效果不好。用例:单击登录 - 单击取消 - 再次单击登录。它使更多的意见,每次创建一个窗口两次登录点击 – ASh