2017-02-16 2 views
-2

私はC#でWPFアプリケーションを作成しています。このウィンドウには「ログイン」というボタンがあるメインウィンドウがあります。これをクリックすると、ログインフォームを含む2番目のウィンドウが表示されます。ログインウィンドウで[キャンセル]ボタンをクリックすると、ログインウィンドウを閉じてメインウィンドウに戻りたいと思います。最初のウィンドウのコードで生成された2番目のウィンドウを閉じる

これは私が思いついた解決策です。しかし、ログインウィンドウのインスタンスはメインウィンドウのメソッドButtonLogin_Click()内に作成され、ログインウィンドウのメソッドButtonCancel_Click()はthis.Close()だけになりますので、メインウィンドウのボタンをもう一度押しますか?ログインウィンドウの既存のインスタンスが再度表示されるか、ボタンをクリックするたびに新しいインスタンスが作成されますか(これは、明らかに必要なものではありません。ログインボタンを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で、シングルトンはうまく動作しません。ユースケース:ログインをクリック - キャンセルをクリック - 再度ログインをクリックそれぞれのログインをクリックする度に2回ウィンドウを作成するようになります – 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; 
    } 
を閉じたときに再びnullに設定するとき、ログインウィンドウをアクティブにするよりよいことだと思います
+0

これは例外をスローします。あなたは可視性を変更する必要があります。私の答えを見てください。 – Ron

+0

@logithackこれに問題がある場合はお知らせください –

+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でのイベント処理をグーグルで調べると、より多くを見つけることができます – Ron

0

はモーダルとしてウィンドウを開きます。

LoginWindow.Show(); - ログインウインドウがモーダルダイアログのほかに

関連する問題