2016-05-24 18 views
1

タイトルによれば、ダイアログを閉じることなくDialogResultを設定することはできますか?ダイアログを閉じることなくDialogResultを設定します

おそらく簡単な答えはNOですが、それはなぜですか? DialogResult=の背後にある行動は何ですか?それを無効にする方法はありますか?

なぜ私はこのようなものが必要なのか誰にでも、簡単な答えは好奇心です。この好奇心の後ろの歴史は、「私は私のViewModel.Myアプローチからダイアログウィンドウを呼び出ししようとしていますが、ダイアログその例には、以下の

の混合物であるということです戻り値(True(Ok)/ False(Cancel))がある場合、Dialogsを処理しているクラスの値をダイアログのviewModelから渡してから、親ウィンドウ/コントロールを取得するためにDialogResultとして設定する必要がありますダイアログが戻ったり閉じたりしたときにそれを返します。 「ダイアログのクローズが」dialog.Close();を呼び出す前に、出力に出力されたときに、これは、ダイアログが閉じて、失敗しませんが

それをテストするための最小限のコードスニペットは、

dialog.DialogResult = TheResult; 
Debug.WriteLine("Dialog Closed"); 
dialog.Close(); 

のようなものです。 Window.Closingイベントを無効にすると、dialog.DialogResultを呼び出すと起動することがありますが、その後はdialog.Close();が呼び出されたときは表示されません。

注:上記のコードが機能し、望ましい機能を損なわないため、全体的な質問は「好奇心から」です。

+0

にOnStartupイベントでShowDialogメソッドを使用してメインウィンドウを開いた私がテストされたコードであり、あなたはそれが実際に '閉じる()'を呼び出す前に閉じてよろしいですか?例外はありますか?より多くのコードを表示できますか? –

+0

@PatrickHofmanさらに詳しい情報を追加しました。私のコードの残りの部分は無関係だと思います。また、私には例外がありません。 – Athafoud

答えて

2

これは仕様で、DialogResultがダイアログを閉じるように設定されています。 Source Code for Window.DialogResult

public Nullable<bool> DialogResult 
    { 
     get 
     { 
      .... 
     } 
     set 
     { 
      .... 
       if (_dialogResult != value) 
       { 
        _dialogResult = value;      
        if(_isClosing == false) 
        { 
         Close(); 
        } 
       } 
      ... 
      }     
     } 
    } 
1

を確認してください。これは正常な動作です。具体的に...

「あなたはウィンドウ上でこのプロパティを設定するとウィンドウが自動的に閉じ、ShowDialogの方法は、あなたが設定した結果を以下の

https://marlongrech.wordpress.com/2008/05/28/wpf-dialogs-and-dialogresult/

を見て返してきましたDialogResultプロパティ。

DialogResultは、DialogResultの値を設定すると、ダイアログの使用の終了を知らせるという意味になり、ダイアログの結果を返しているので。

DialogResultを設定すると、Closeがトリガーされました。現在のメソッドが完了すると、ダイアログが閉じます。これは、Debug.WriteLineがdialog.Close()と同様に実行されることを意味します。

あなたが閉じるように最初の呼び出しが近くをトリガし、閉会とクローズイベントを発生させます

this.Close(); 
MessageBox.Show("TEST"); 
this.Close(); 

をクリックし、ボタンで次のように実行した場合、コードがメッセージボックスので、実行を継続し、同じを見るでしょうが表示されると、2番目のClose呼び出しが呼び出されますが、closeがすでに呼び出されているため無視されます。これ以上のイベントは発生しません。

これは私がApp.xaml.cs

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

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = true; 
     //Or call Close 
     //this.Close(); 

     MessageBox.Show("TEST"); 

     this.Close(); 
    } 

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     MessageBox.Show("Window_Closing"); 
    } 

    private void Window_Closed(object sender, EventArgs e) 
    { 
     MessageBox.Show("Window_Closed"); 
    } 
} 
+0

私の場合は、クローズイベントとクローズイベントが発生し、コードは実行を続けるが、メッセージボックスは表示されなくなる。 – Athafoud

+0

あなたのケースにMessageBoxが表示されないことは奇妙です。私はテストした簡単なコードで自分の答えを更新しました。 "Window_Closing"と表示されたボタンをクリックするとダイアログが消え、 "Window_Closed"、 "TEST"が表示され、アプリケーションが終了します。 – Marc

+0

これも私のテストケースでしたが、同じ結果が得られました。ダイアログは 'DialogResult ='で消えます。 – Athafoud

関連する問題