2017-01-11 42 views
0

親フォームが長い操作を実行しているときにダイアログとして表示したいフォームにProgressBarがあります。ダイアログフォームのWPF更新プログレスバー

ProgressWindowは単純です:

コンストラクタは、最大値を取り込んで、私はインクリメント方法があります。私はインスタンスを作成し、親に

public ProgressWindow(int count) 
{ 
    InitializeComponent(); 
    fileProgressBar.Maximum = count; 
} 

public void IncremntProgress() 
{ 
    fileProgressBar.Value++; 
} 

ProgressWindow progressWindow = new ProgressWindow(listOfFiles.Count); 
progressWindow.Show(); 

私は、大規模な操作を実行すると、私はプログレスバーを更新する:

foreach (var file in listOfFiles) 
{ 
    .... 
    progressWindow.IncremntProgress(); 
} 

progressWindow.Close(); 

これは動作しますが、私が好きなフォームがダイアログになり、進行状況バーが正しく更新されません。

ダイアログウィンドウで進捗バーを更新する方法はありますか?

+0

XAMLの 'ProgressBar'最小値と最大値はありますか? '' – Smartis

+0

UIスレッドで大規模な操作を実行すると、 'foreach'の全期間、UIに描画/更新させません何でも3)別のスレッドで作成したウィンドウを使用して進行状況を表示します(UIに変更が多すぎるとよい場合もあります)。3) 'Application.DoEvents()'を呼び出します。定期的にループの内側にあります(推奨されません)。 – Sinatr

+0

はい、私は最小値と最大値を設定しました – Sun

答えて

0

それは「正しく更新されません」何不明だ実際にここに意味がありますが、バックグラウンドスレッド上で「大きなオペレーション」を実行し、バックUIスレッド上のProgressBarを含む任意のUI要素を更新する必要があります

Task.Run(() => 
{ 
    //... 
    foreach (var file in listOfFiles) 
    { 
     //... 
     progressWindow.Dispatcher.Invoke(new Action(()=> progressWindow.IncremntProgress())); 
    } 
}).ContinueWith(task => 
{ 
    progressWindow.Close(); 
}, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); 

UIスレッドは、ProgressBarを更新したり、操作/ループを同時に実行することはできません。

+0

これは素晴らしいですが、とにかくprogressWindow Modalを作成するにはどうしますか? – Sun

関連する問題