2011-03-31 87 views
0

我有一个WPF窗体,它运行带进度条的后台操作。但问题是,WPF ProgressBar - 完成操作后完成进度条

当操作完成时,进度条仍在运行。我的意思是它表明正在进行操作。

我该如何阻止?这是我的整个代码;

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(); 
     } 

    } 

} 
+0

你是什么意思,它仍然在运行?它不是100%吗? – 2011-03-31 16:45:36

回答

4

如果要隐藏进度工作完成后,其Visibility属性设置为Visibility.Hidden。如果您只是想将其重置为初始状态,请将其设置为Value0(或如果将其从默认值更改为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(); 
     } 
    } 
} 
+0

@heinzi感谢您的回复。在完成进度之后,我一直在设置100的值:)谢谢你的提示。 – tugberk 2011-03-31 16:44:13

+0

另外,我想问一下进度条并不全都与进程同步。我怎样才能使其与进度同步。 – tugberk 2011-03-31 16:45:27

+0

@tugberk_ugurlu_:我已经更新了我的答案。 – Heinzi 2011-03-31 16:48:24