C# WPF进度条-在操作完成后完成进度条
我有一个WPF表单,它使用进度条运行后台操作。但问题是, 操作完成后,进度条仍在运行。我的意思是,这表明手术正在进行中 我怎样才能阻止它?这是我的全部代码C# WPF进度条-在操作完成后完成进度条,c#,wpf,progress-bar,backgroundworker,system.diagnostics,C#,Wpf,Progress Bar,Backgroundworker,System.diagnostics,我有一个WPF表单,它使用进度条运行后台操作。但问题是, 操作完成后,进度条仍在运行。我的意思是,这表明手术正在进行中 我怎样才能阻止它?这是我的全部代码 System.ComponentModel.BackgroundWorker mWorker; private void button1_Click(object sender, RoutedEventArgs e) { mWorker = new System.ComponentModel.BackgroundWorker();
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
(或者设置为pbProgressing.Minimum
,如果您更改了默认值)
作为旁注,您的代码没有真正意义:您不应该在按钮事件处理程序中不断更改pbProcessing.Value
(这是完全无用的,因为在按钮事件处理程序完成之前不会执行任何UI更新),而应该只更改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();
}
}
}
System.ComponentModel.BackgroundWorker mWorker;
私有无效按钮1\u单击(对象发送者,路由目标){
mWorker=新系统.ComponentModel.BackgroundWorker();
mWorker.DoWork+=新系统.ComponentModel.DoWorkEventHandler(worker\u DoWork);
mWorker.ProgressChanged+=新系统.ComponentModel.ProgressChangedEventHandler(worker\u ProgressChanged);
mWorker.WorkerReportsProgress=true;
mWorker.Workers支持扫描单元=真;
mWorker.RunWorkerCompleted+=新系统.ComponentModel.RunWorkerCompletedEventHandler(worker\U RunWorkerCompleted);
mWorker.RunWorkerAsync();
//不要在这里做任何其他事情
}
私有void worker_DoWork(对象发送方,System.ComponentModel.DoWorkEventArgs e){
对于(int i=1;i<100;i++){
M工作进度报告(一);
//做一些工作
系统线程线程睡眠(100);
//检查用户是否要中止
if(mWorker.CancellationPending){
e、 取消=真;
返回;
}
}
mWorker.ReportProgress(100);//完成
}
私有void worker_ProgressChanged(对象发送方,System.ComponentModel.ProgressChangedEventArgs e){
pbProcessing.Value=e.ProgressPercentage;
}
私有void worker\u RunWorkerCompleted(对象发送方,System.ComponentModel.RunWorkerCompletedEventArgs e){
//停止进度条更新
Window1 w=新的Window1();
w、 浏览(新Uri(“http://stackoverflow.com"));
w、 Show();
//检查结果
如果(如已取消){
//显示任务已取消的消息框
}
//重置进度条
pbProcessing.Value=0;
}
私有无效窗口\u关闭(对象发送方,System.ComponentModel.CancelEventArgs e){
如果(mWorker!=null){
如果(mWorker.IsBusy){
mWorker.CancelAsync();
}
}
}
如果要在工作完成后隐藏进度条,请将其可见性
属性设置为可见性。隐藏
。如果您只想将其重置为初始状态,请将其值设置为0
(或者设置为pbProgressing.Minimum
,如果您更改了默认值)
作为旁注,您的代码没有真正意义:您不应该在按钮事件处理程序中不断更改pbProcessing.Value
(这是完全无用的,因为在按钮事件处理程序完成之前不会执行任何UI更新),而应该只更改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();
}
}
}
System.ComponentModel.BackgroundWorker mWorker;
私有无效按钮1\u单击(对象发送者,路由目标){
mWorker=新系统.ComponentModel.BackgroundWorker();
mWorker.DoWork+=新系统.ComponentModel.DoWorkEventHandler(worker\u DoWork);
mWorker.ProgressChanged+=新系统.ComponentModel.ProgressChangedEventHandler(worker\u ProgressChanged);
mWorker.WorkerReportsProgress=true;
mWorker.Workers支持扫描单元=真;
mWorker.RunWorkerCompleted+=新系统.ComponentModel.RunWorkerCompletedEventHandler(worker\U RunWorkerCompleted);
mWorker.RunWorkerAsync();
//不要在这里做任何其他事情
}
私有void worker_DoWork(对象发送方,System.ComponentModel.DoWorkEventArgs e){
对于(int i=1;i<100;i++){
M工作进度报告(一);
//做一些工作
系统线程线程睡眠(100);
//检查用户是否要中止
if(mWorker.CancellationPending){
e、 取消=真;
返回;
}
}
mWorker.ReportProgress(100);//完成
}
私有void worker_ProgressChanged(对象发送方,System.ComponentModel.ProgressChangedEventArgs e){
pbProcessing.Value=e.ProgressPercentage;
}
私有void worker\u RunWorkerCompleted(对象发送方,System.ComponentModel.RunWorkerCompletedEventArgs e){
//停止进度条更新
Window1 w=新的Window1();
w、 浏览(新Uri(“http://stackoverflow.com"));
w、 Show();
//检查结果
如果(如已取消){
//显示任务已取消的消息框
}
//重置进度条
pbProcessing.Value=0;
}
私有无效窗口\u关闭(对象发送方,System.ComponentModel.CancelEventArgs e){
如果(mWorker!=null){
如果(mWorker.IsBusy){
mWorker.CancelAsync();
}
}
}
@heinzi感谢您的回复。在进度完成后,我一直在设置值100:)谢谢你的提示。另外,我想问一下进度条是否与进程同步。如何使其与进度同步。@heinzi我想它应该在worker\u Runworker Completed方法中被取消。@heinzi是的,现在所有内容都同步了。这将有点离题,但在一开始,它显示的进展有点晚。当这个过程开始时,我们如何开始呢