WPF ProgressBar - сделать индикатор выполнения завершенным после завершения операции - PullRequest
0 голосов
/ 31 марта 2011

У меня есть форма WPF, которая запускает фоновую операцию с индикатором выполнения.но проблема в том, что

после завершения операции индикатор выполнения все еще работает.Я имею в виду, это показывает, как операция в процессе.

как я могу это остановить?вот весь мой код;

System.ComponentModel.BackgroundWorker mWorker;

private void button1_Click(object sender, RoutedEventArgs e) {

    mWorker = new System.ComponentModel.BackgroundWorker();
    mWorker.DoWork +=new System.ComponentModel.DoWorkEventHandler(worker_DoWork);
    mWorker.ProgressChanged +=new System.ComponentModel.ProgressChangedEventHandler(worker_ProgressChanged);
    mWorker.WorkerReportsProgress = true;
    mWorker.WorkerSupportsCancellation = true;
    mWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    mWorker.RunWorkerAsync();

    while (pbProcessing.Value != 100) {

        if (!mWorker.CancellationPending) {

            try {

                pbProcessing.Value = (pbProcessing.Value + 0.01) % 100;

            } catch (System.Exception ex) {

                // No action required
            }

        } else {

            MessageBox.Show(this, "Process cancelled", "Cancel Process", MessageBoxButton.OK);
            break;

        }

        System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background,
               new System.Threading.ThreadStart(delegate { }));

    }

}

private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {

    // Do your work here, its on seperate thread
    System.Threading.Thread.Sleep(10000);

}
private void worker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) {

    pbProcessing.Value = e.ProgressPercentage;

}
private void worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) {

    // Stop Progressbar updatation  
    Window1 w = new Window1();
    w.Browser.Navigate(new Uri("http://stackoverflow.com"));
    w.Show();

}

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) {

    if (mWorker != null) {

        if (mWorker.IsBusy) {
            mWorker.CancelAsync();
        }

    }

}

1 Ответ

4 голосов
/ 31 марта 2011

Если вы хотите скрыть индикатор выполнения после завершения работы, установите для его свойства Visibility значение Visibility.Hidden. Если вы просто хотите сбросить его в исходное состояние, установите для Value значение 0 (или pbProgressing.Minimum, если вы изменили его значение по умолчанию).


В качестве примечания, ваш код на самом деле не имеет смысла: вместо постоянного изменения pbProcessing.Value в обработчике событий кнопки (что совершенно бесполезно, поскольку обновления пользовательского интерфейса не выполняются, пока не завершится обработчик события кнопки) Вы должны изменить только значение в ProgressChanged. Т.е. ваш код должен выглядеть примерно так:

System.ComponentModel.BackgroundWorker mWorker;

private void button1_Click(object sender, RoutedEventArgs e) {

    mWorker = new System.ComponentModel.BackgroundWorker();
    mWorker.DoWork +=new System.ComponentModel.DoWorkEventHandler(worker_DoWork);
    mWorker.ProgressChanged +=new System.ComponentModel.ProgressChangedEventHandler(worker_ProgressChanged);
    mWorker.WorkerReportsProgress = true;
    mWorker.WorkerSupportsCancellation = true;
    mWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    mWorker.RunWorkerAsync();

    // Don't do anything else here

}

private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {
    for (int i = 1; i < 100; i++) {
        mWorker.ReportProgress(i);

        // Do some part of the work
        System.Threading.Thread.Sleep(100);

        // Check if the user wants to abort
        if (mWorker.CancellationPending) {
            e.Cancel = true;
            return;
        }
    }

    mWorker.ReportProgress(100);  // Done
}

private void worker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) {
    pbProcessing.Value = e.ProgressPercentage;
}

private void worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) {

    // Stop Progressbar updatation  
    Window1 w = new Window1();
    w.Browser.Navigate(new Uri("http://stackoverflow.com"));
    w.Show();

    // Check the result
    if (e.Cancelled) {
        // show the message box that the task has been canceled
    }

    // Reset Progress bar
    pbProcessing.Value = 0;
}

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
    if (mWorker != null) {
        if (mWorker.IsBusy) {
            mWorker.CancelAsync();
        }
    }
}
...