Animate ProgressBar содержимое WPF с определенным значением

Я пытаюсь разработать ProgressBar это заполняет соответственно значению, которое я вручную установил для него. Например, у меня есть это ProgressBar:

<ProgressBar Height="33" HorizontalAlignment="Left" Name="progressBar1" VerticalAlignment="Top" Width="285" />

У меня есть кнопка, которая увеличивает ProgressBar значение в 10 единиц при каждом нажатии, например:

private void button1_Click(object sender, RoutedEventArgs e)
{
    progressBar1.Value += 10;
}

Я хочу анимировать это изменение значения каждый раз, когда я нажимаю на него. Я попробовал это:

Duration duration = new Duration(TimeSpan.FromSeconds(1));
DoubleAnimation doubleanimation = new DoubleAnimation(200.0, duration);
progressBar1.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);

Но это идет от 0 до 100 значения ProgressBar, Как я могу сказать анимации остановиться на определенном значении, вместо того, чтобы перейти на 100%?

3 ответа

Решение

Вы на самом деле оживляете Value до конечного значения 200, если вы делаете следующее:

DoubleAnimation doubleanimation = new DoubleAnimation(200.0, duration);

Вместо этого измените первый аргумент на значение, которое вы хотите анимировать. Ваш обработчик событий должен выглядеть так:

private void button1_Click(object sender, RoutedEventArgs e)
{
    Duration duration = new Duration(TimeSpan.FromSeconds(1));
    DoubleAnimation doubleanimation = new DoubleAnimation(progressBar1.Value + 10, duration);
    progressBar1.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);
}

DoubleAnimation Constructor (Double, Duration) первый параматер

Целевое значение анимации.

Так что измени это

DoubleAnimation doubleanimation = new DoubleAnimation(200.0, duration);

в

DoubleAnimation doubleanimation = new DoubleAnimation(progressBar1.Value, duration);

Для тех, кто заинтересован, я нашел решение по этой ссылке. Это объясняет, как заполнить ProgressBar значение с помощью BackgroundWorker,

Я написал этот код:

 public MainWindow()
 {
    InitializeComponent();

    backgroundworker.WorkerReportsProgress = true;
    backgroundworker.WorkerSupportsCancellation = true;
    backgroundworker.DoWork += backgroundworker_DoWork;
    backgroundworker.ProgressChanged += backgroundworker_ProgressChanged;
}

private void buttonStop_Click(object sender, RoutedEventArgs e)
{
    backgroundworker.CancelAsync();
    e.Handled = true;
}

private void buttonStart_Click(object sender, RoutedEventArgs e)
{
    if (backgroundworker.IsBusy == false)
    {
       backgroundworker.RunWorkerAsync();
    }
    e.Handled = true;
}

void backgroundworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

void backgroundworker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    if (worker != null)
    {
        for (int i = 0; i <= 10; i++)
        {
            if (worker.CancellationPending)
            {
                e.Cancel = true;
                break;
            }

            System.Threading.Thread.Sleep(50);
            worker.ReportProgress(i);
        }
    }
}
Другие вопросы по тегам