2017-02-16 130 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(); - 直到登錄窗口關閉