2016-11-15 11 views
0

ユーザーがExecuteボタンをクリックすると、何かを行い、出力ログメッセージを徐々にTextBlockに出力します。WPF TextBlockは、すべての作業が完了した後にのみすべてのログメッセージを表示します

問題は、私のTextBlockがすべての作業が終了した(遅すぎる)と内容が変更されることです。プロセス中にWPFに強制的に再描画させるにはどうすればよいですか?

コードは次のようになります。

private void btn_execute_Click(object sender, RoutedEventArgs e) 
    { 
     .... stuff .... 
    } 

私は期待どおりに動作しませんでした、TextBlockに変更した後output_log.InvalidateVisual();を追加しようとしています。

+2

なぜこのコードの背後にあるのですか?MVVMを使用していませんか? – Keith

答えて

1

あなたがButtonClickハンドラで同期コードを実行した場合、このコードはDispatcherスレッドで実行し、これTextBlockにあなたのメッセージの変更を表示するなどの他のコードを実行しているからDispatcherを防止しています。

この問題を解決するには、少なくとも3つの方法があります。

まず、あなたは別のThreadTaskまたはasyncイベントハンドラでは、あなたのExecuteコードを実行し、Dispatcherを使用してTextを設定することができます。

private async void btn_execute_Click(object sender, RoutedEventArgs e) 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     // Simulate doing some stuff... 
     await Task.Delay(100); 

     // Thanks to async/await the current context is captured and 
     // switches automatically back to the Dispatcher thread after the await. 
     output_log.Text += i + ", "; 

     // If you were using Task.Run() instead then you would have to invoke it manually. 
     // Dispatcher.Invoke(() => output_log.Text += i + ", "); 
    } 
} 

主な利点は、あなたがDispatcherをブロックしていないということです - あなたがしているすべてのことに強くお勧めします。


第二が、あなたはDispatcherであなたのExecuteコードをやり続けることができますが、その後、あなたはそれがすべての待機中のUIを処理できるように、あなたのテキストを更新するたびに、「フラッシュ」Dispatcher持っています行動:

private void btn_execute_Click(object sender, RoutedEventArgs e) 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     // Simulate doing some stuff... 
     Thread.Sleep(100); 
     output_log.Text += i + ", "; 
     Dispatcher.Invoke(DispatcherPriority.Background, new Action(() => { })); 
    } 
} 

これは確かに可能ですが、私は本当にそれをお勧めしません。


またはサード

    あなたのアーキテクチャ用 MVVMを使用することができます
  • は、asyncイベントハンドラ(またはCommand)にごExecuteコードを実行
  • 変更のみLogTextViewModelの属性と
  • データバインディングを使用してTextBlock.TextをこのMyLogViewModel.LogTextプロパティにバインドします。

残念ながら、私はあなたに、このシナリオのための迅速なサンプルコードを与えることはできませんが、MVVMは、WPFアプリケーションの任意の種類のために本当に自然なアーキテクチャであるため、それは確かにそれについて考える価値があります。

関連する問題