Как обновить индикатор выполнения, чтобы он плавно увеличивался? - программирование
Подтвердить что ты не робот

Как обновить индикатор выполнения, чтобы он плавно увеличивался?

Я использую индикатор выполнения WPF (С#) для описания процесса.

Мой алгоритм ниже:

DoSomethingCode1();
ProgressBar.SetPercent(10); // 10%
DoSomethingCode2();
ProgressBar.SetPercent(20); // 20%

...

DoSomethingCode10();
ProgressBar.SetPercent(100); // 100%

Это нормально, но это сделает индикатор выполнения не секвентированным.

Кто-нибудь может сказать мне несколько советов, которые улучшают отображение индикатора выполнения?

4b9b3361

Ответ 1

Вы можете вызвать метод BeginAnimation для анимации свойства ProgressBar Value. В моем примере ниже я использовал DoubleAnimation.

Я создал метод расширения, который принимает желаемый процент:

public static class ProgressBarExtensions
{
    private static TimeSpan duration = TimeSpan.FromSeconds(2);

    public static void SetPercent(this ProgressBar progressBar, double percentage)
    {
        DoubleAnimation animation = new DoubleAnimation(percentage, duration);
        progressBar.BeginAnimation(ProgressBar.ValueProperty, animation);          
    }
}

Итак, в вашем коде вы можете просто позвонить:

myProgressBar.SetPercent(50);

Выполнение этого просто сглаживает переход, чтобы он выглядел лучше. Чтобы процитировать еще один ответ: "Идея состоит в том, что индикатор прогресса сообщает о реальном прогрессе - время не прошло. Оно не предназначено для анимации, которая просто указывает на то, что происходит". Однако стиль по умолчанию индикатора выполнения имеет пульсирующий эффект, который может означать, что происходит работа.

Ответ 2

Вы можете использовать поведение!

public class ProgressBarSmoother
{
    public static double GetSmoothValue(DependencyObject obj)
    {
        return (double)obj.GetValue(SmoothValueProperty);
    }

    public static void SetSmoothValue(DependencyObject obj, double value)
    {
        obj.SetValue(SmoothValueProperty, value);
    }

    public static readonly DependencyProperty SmoothValueProperty =
        DependencyProperty.RegisterAttached("SmoothValue", typeof(double), typeof(ProgressBarSmoother), new PropertyMetadata(0.0, changing));

    private static void changing(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var anim = new DoubleAnimation((double)e.OldValue, (double)e.NewValue, new TimeSpan(0,0,0,0,250));
        (d as ProgressBar).BeginAnimation(ProgressBar.ValueProperty, anim, HandoffBehavior.Compose);
    }
}

Ваш XAML будет выглядеть так:

<ProgressBar local:ProgressBarSmoother.SmoothValue="{Binding Progress}">

Всякий раз, когда свойство Progress, с которым вы привязываетесь в xaml, изменяется, будет выполняться код в поведении ProgressBarSmoother, добавив анимацию в индикатор выполнения для вас с соответствующими значениями для To и From!

Ответ 3

Проверьте, можете ли вы изменить стиль панели выполнения и установить в него раскадровку функцию "Ослабление", которая изменяет "заполнение" панели прогресса и, делая это, будет иметь плавный переход.

Ответ 4

попробуйте это.

private void updateProgressBar(int percent)
    {
        if (ProgressBar.InvokeRequired)
        {
            updateProgressBarCallback cb = new updateProgressBarCallback(updateProgressBar);
            this.Invoke(cb, new object[] { percent });
        }
        else
        {
            ProgressBar.Value = percent;
            ProgressBar.Update();
            ProgressBar.Refresh();
            ProgressBar.Invalidate();
        }