私はWPFMVVMを使用しており、バックグラウンドワーカーを使用して、タスクの進行状況を報告するための進行状況バーがあります。作業の完了時にプログレスバーを折りたたむと問題が発生する場合を除いて、機能します。そうすると、プログレスバーが最後まで到達しません。プログレスバーを表示したままにしておくと問題ありませんが、タスクの終了時にプログレスバーを表示したくありません。誰かが私がどこで間違っているのか教えてもらえますか?以下のGenerateOutputは、いくつかのファイルを作成し、進行状況を更新する関数です。ShowSummary()は、タスクの終了時に実行する必要があるものです。RunWorkerCompletedにThread.Sleepを入れてみました。これは、ユーザーが実際に完成したバーを折りたたむ前に表示できるようにするためですが、それでも完了は表示されません。
public void BackgroundWorkerGenerateOutputProgress()
{
ProgressVisibility = Visibility.Visible;
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
worker.RunWorkerAsync();
}
void DoWork(object sender, DoWorkEventArgs e)
{
if (IsInProgress)
return;
CurrentProgress = 0;
IsInProgress = true;
BackgroundWorker worker = sender as BackgroundWorker;
GenerateOutput();
}
void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
IsInProgress = false;
ProgressVisibility = Visibility.Collapsed;
ShowSummary();
}
編集:私はそれを以下に変更しました、私はまだプログレスバーが終わりに達するのを見ていません:
public void BackgroundWorkerGenerateOutputProgress()
{
ProgressVisibility = Visibility.Visible;
CurrentProgress = 0;
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
worker.ProgressChanged += new ProgressChangedEventHandler(ProgressChanged);
worker.RunWorkerAsync();
}
private void ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
CurrentProgress = e.ProgressPercentage;
}
void DoWork(object sender, DoWorkEventArgs e)
{
if (IsInProgress)
return;
IsInProgress = true;
BackgroundWorker worker = sender as BackgroundWorker;
DoIt(worker);
}
void DoIt(BackgroundWorker worker)
{
worker.ReportProgress(20);
Thread.Sleep(1000);
worker.ReportProgress(40);
Thread.Sleep(1000);
worker.ReportProgress(60);
Thread.Sleep(1000);
worker.ReportProgress(80);
Thread.Sleep(1000);
worker.ReportProgress(100);
}
void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
IsInProgress = false;
ShowSummary();
System.Threading.Thread.Sleep(2000);
ProgressVisibility = Visibility.Collapsed;
}
xaml(申し訳ありませんがフォーマットできません):
<ProgressBar HorizontalAlignment="Left" Value="{Binding CurrentProgress, Mode=OneWay}" Height="20" Width="200" Visibility="{Binding Path=ProgressVisibility}" Minimum="0" Maximum="100" />