2017-02-16 132 views
-2

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

这是我想出的解决方案。但是,由于Login窗口的实例是在主窗口的ButtonLogin_Click()方法内部创建的,并且由于登录窗口的ButtonCancel_Click()方法只有this.Close(),所以如果单击“Login”再次在主窗口中按钮?将登录窗口的现有实例再次显示,还是每次单击按钮时都会创建一个新实例(这不是我想要的,因为如果单击“登录”窗口后最终会有n个登录窗口实例登录按钮n次)?做这个的最好方式是什么?

Main window

Login window

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(); 
     } 
    } 
} 
+1

打开一个窗口为模态:'LoginWindow.Show();' - >'LoginWindow.ShowDialog();'。 MainWindow将无法访问,直到LoginWindow关闭 – ASh

+0

[相关](https://stackoverflow.com/questions/6320393/how-to-create-a-class-which-can-only-have-a-single-instance-in -c-sharp) – user5226582

+0

@ user5226582,singletone在这里效果不好。用例:单击登录 - 单击取消 - 再次单击登录。它使更多的意见,每次创建一个窗口两次登录点击 – ASh

回答

0

除了模态对话框>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; 
    } 
+0

这会引发异常。你应该改变可见性。看到我的答案。 – Ron

+0

@logithack让我知道,如果你有任何问题,这 – 2017-02-16 09:27:11

+0

这也必须工作(我指着你的编辑前的答案)。谢谢 – Ron

0

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

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; 
    } 
+0

这看起来像我在找什么。不过,我并没有那种在C#中使用GUI编程的经验。你可以请我解释一下_LoginWindow.Closing + = LoginWindow_Closing_;是关于?谢谢! – logithack

+0

http://stackoverflow.com/a/9711424/5615980,你可以在wpf中找到更多的使用googling事件处理的方法 – Ron

0

打开一个窗口模式:

LoginWindow.Show(); - 直到登录窗口关闭