2011-07-27 13 views
2

WPFのコントロール(ラベルのテキストなど)を正しく変更することがわかっている場合は、ディスパッチャの更新をエンキューします。ディスパッチャーは自分のコードが終了するのを待っています。WPF - 同期UIアップデート

このため

、「完成」ReportProgressは、このイベントハンドラ

private void handlerProgressMade (object sender, ProgressEventArgs e) 
{ 
    pbProgress.Value = pbProgress.Maximum * e.Percent; 
    lbProgressMessage.Content = e.Message; 
} 

でイベントを呼び出す

double current = 0; 
ReportProgress (0d, "ProcessingStarted"); 
foreach (var item in collection) 
{ 
     item.Process(); //takes about 10s 
     current++; 
     ReportProgress (current/(double)collection.Count, "Processing item No. " + current.ToString() + " finished"); 
} 
ReportProgress (1d, "Finished"); 

がいっぱいプログレスバーとメッセージで終了呼び出しが表示されますが、interstepsは表示されません。

私は、別のスレッドで関数を呼び出して非同期的にUIを更新することで(これはある時点で起こる)、スレッドを追加することは不要な複雑さのようです。

Dispatcherに更新および再描画を強制する方法を教えてください。

+0

あなたはそれを稼働させるための他の選択肢がないように思えます。あなたはスレッド化のために行かなくてはいけません。もし誰も周りの作業がなければ、スレッド化のために行くでしょう..次のリンクはスレッドhttp://bathinenivenkatesh.blogspot .com/2011/07/wpf-build-more-responsive-ui.html – Bathineni

+0

@bathineniスレッドで行うことができます。 UIが応答している場合は重要ではなく、進捗状況の報告は問題ありません。 – Lukas

+1

@ Lukas ..私は間違っているかもしれませんが、私にとって進捗状況は何もUIレスポンスではありません。 – Bathineni

答えて

0

あなたはプログレスバーの値を設定し、その後の前と後に、バックグラウンドスレッドを使用したくない場合は、Application.DoEvents()の古いハックが、それはGUIメッセージバス

に積もってしまったすべてのメッセージキューをクリアするために待機するように役立つかもしれません
+0

System.Windows.Forms.Application.DoEvents(); (wpfアプリケーションでは気分が悪い)最終的なアップデートは、すべての状態が完全に終了したときに点滅しているのを見ることができるレベルにまで低下しますが、 – Lukas

+0

これが役に立ちます:http://dedjo.blogspot.com/2007/08/how-to-doevents-in-wpf.html? –

関連する問題