2016-04-16 11 views
2

WPF/MVVMアプリケーションで作業する。 私のメインスレッドから新しいタスクにMVCウィンドウを表示し、メインスレッドがウィンドウを閉じるのを待つことなく次の命令を実行し続けるようにするにはどうすればよいですか?ウィンドウを新しいタスクに実行してメインスレッドを実行し続ける方法

私は次のように実行したいと思います:

Window window = new Window(); 
    View view = new View(); 
    ViewModel viewModel = new ViewModel(); 
    window.Content = view; 

window.Show(); 

... program then continues with business stuff 

を明らかに、私は、ウィンドウはすぐに返し、閉じ

window.Show(); 

を実行する場合。

私は

window.ShowDialog() 

を使用している場合、スレッドは、私は続行し、次の手順を必要とするように私が望むものではないユーザーによってクローズするウィンドウを待ちます。

私は新しいスレッドにウィンドウを実行する必要があるが、これはadditionnalの問題をもたらしているとします

Task.Run(() => window.ShowDialog())); 

ウィンドウは異なるものに作成されたように、これはどちらか動作しません。

だから、私は新しいタスク内window.ShowDialogの実行を許可するディスパッチャを使用する必要があるとします

Task.Run(() => Application.Current.Dispatcher.Invoke(() => window.ShowDialog())); 

をしかし、これはどちらか動作しません。コンパイラはそれを受け入れ、実行時に例外をスローしませんが、ウィンドウは決して開かれません。ステップバイステップモードでデバッグすると、デバッガが新しいタスクの中に匿名を入力することはありません。

これは非常に簡単なはずですが、これを解決することはできません。あなたの親切な援助のために事前に Thx

+0

サブウィンドウ用に個別のWindow.xamlを作成しましたか? –

+0

実際に私はテストプロジェクトのテストメソッドからこのコードを実行します。 私は実行しようとするテストウィンドウ用に1つのxamlしか持っていません。 –

+0

'window.Show();'に何が間違っていますか? – Nitin

答えて

3

Window.Show()スレッドをブロックしません。また、ユーザーが別のウィンドウを閉じるまで(またはプログラムで閉じて)はじめて返されます。それはあなたが望むものになるかもしれません。

メインウィンドウとMVCウィンドウ用に別々のUIスレッドを使用する場合は、別のスレッドで新しいウィンドウを開始し、新しいUIスレッドに必要な配管作業を行うことができます。

var thread = new Thread(() => 
         { 
          SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher)); 

          Window window = new Window(); 
          View view = new View(); 
          ViewModel viewModel = new ViewModel(); 
          window.Content = view; 

          // When the window closes, shut down the dispatcher 
          window.Closed += (s, args) => 
               Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background); 

          window.Show(); 

          // Start the Dispatcher Processing 
          Dispatcher.Run(); 
         }); 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 

詳細は@Reed Copseyからthisブログ記事を参照してください。

+0

それは働いていました。分かち合うために、正確に私が間違っていたことを調べるのにもっと時間を費やしています。 Thx a ton天皇 –

関連する問題