Как показать в прогрессбар 100% перед закрытием - PullRequest
0 голосов
/ 23 февраля 2012

Я использую индикатор выполнения, чтобы показать пользователю ход выполнения операции, отнимающей много времени. Моя проблема заключается в том, что во время выполнения операции фоновый работник не может сообщить о каком-либо прогрессе до его завершения. за одну итерацию индикатор выполнения всегда показывает 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 ]

2 голосов
/ 23 февраля 2012

В этом типе ситуации вы можете рассмотреть возможность установить для свойства IsIndeterminate значение true и забыть о настройке значения. Это даст вам эффект выделения, поэтому у пользователя создается впечатление, что что-то происходит.

0 голосов
/ 23 февраля 2012

Я могу придумать два варианта:

  1. Когда работа закончена, не закрывайте ее немедленно.Вместо этого установите таймер, чтобы закрыть его, и установите прогресс на 100%, чтобы пользователь мог его увидеть.индикатор выполнения на самом деле показывает 100% выполнения за время между 95 и 100%.

...