如何在关闭前100%显示进度条

时间:2012-02-23 06:32:28

标签: c# wpf progress-bar user-experience

我正在使用进度条在耗时的操作中向用户显示进度。我的问题是,当我正在进行操作时,后台工作人员在完成之前无法报告任何进度。所以如果我只有一次迭代,进度条总是显示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;
    }

2 个答案:

答案 0 :(得分:2)

在这种情况下,您可能需要考虑将IsIndeterminate属性设置为true并忘记设置值。这将为您提供一个选框效果,因此用户会产生一些事情正在发生的印象。

答案 1 :(得分:0)

我能想到的两个选择:

  1. 完成工作后,请勿立即关闭。相反,设置一个计时器来关闭它并将进度设置为100%足够的时间让用户看到它。

  2. 将百分比提高5个百分点,因此进度条实际显示 100%完成95%到100%之间的时间。