1

私は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" />
4

2 に答える 2

1

このリンクに示されているように ReportProgress を試してください。WorkerReportsProgress = true がありません

BackgroundWorker クラス

GenerateOutput() の最後に設定している場合は、Visibility.Collapsed に設定されます。UI がレンダリングされる前。

于 2012-12-13T14:32:10.123 に答える
0

私はこれを試していませんが、論理的に考えて、このアプリを実行します。非表示にする前に、progress の値を maxvalue に設定します。

void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    CurrentProgress = 0; //Set this to max value
    IsInProgress = false;
    ProgressVisibility = Visibility.Collapsed;
    ShowSummary();
}
于 2012-12-13T13:44:23.970 に答える