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);
}
}
}