我正在使用进度条在耗时的操作中向用户显示进度。我的问题是,当我正在进行操作时,后台工作人员在完成之前无法报告任何进度。所以如果我只有一次迭代,进度条总是显示0%,当它完成时,进度条立即关闭。所以用户没有得到任务完成的印象。我正在寻找一种方法让用户知道任务是在progessbar关闭之前完成。我的代码如下。
this.progressDialog = new progressDialog();
Dispatcher pdDispatcher = ((Window)this.progressDialog).Dispatcher;
this.worker = new BackgroundWorker();
this.worker.WorkerSupportsCancellation = true;
this.worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
this.worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
foreach (Element id in state.Elements)
{
if (this.worker.CancellationPending)
{
args.Cancel = true;
return;
}
UpdateProgressDelegate update = new UpdateProgressDelegate(this.UpdateProgressText);
pdDispatcher.BeginInvoke(update, Convert.ToInt32(((decimal)state.Elements.IndexOf(id) / (decimal)state.Elements.Count()) * 100), state.Elements.Count());
Element newElement = this.Item.Copy(id);
if (newElement .HasValue)
{
state.CreatedElements.Add(newElement.Value);
}
}
};
this.worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
if (!(args.Error == null))
{
throw args.Error;
}
this.UpdateDisplayItems();
this.progressDialog.Close();
this.progressDialog.Dispose();
};
this.worker.RunWorkerAsync();
this.progressDialog.Show();
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressDialog.Value = e.ProgressPercentage;
}
public void UpdateProgressText(int percentage, int recordCount)
{
this.progressDialog.Description = string.Format("{0}% of {1} Records", percentage.ToString(), recordCount);
this.progressDialog.Value = percentage;
}
答案 0 :(得分:2)
在这种情况下,您可能需要考虑将IsIndeterminate
属性设置为true并忘记设置值。这将为您提供一个选框效果,因此用户会产生一些事情正在发生的印象。
答案 1 :(得分:0)
我能想到的两个选择:
完成工作后,请勿立即关闭。相反,设置一个计时器来关闭它并将进度设置为100%足够的时间让用户看到它。
将百分比提高5个百分点,因此进度条实际显示 100%完成95%到100%之间的时间。