2011-03-31 85 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