#c# #wpf #c#-4.0
#c# #wpf #c #-4.0
Вопрос:
Я хочу анимировать прогресс, чтобы для завершения цикла требовалась 1 минута. Мой код:
ProgressBar _progressSec = new ProgressBar();
_progressSec.Name = "_progressSec";
_progressSec.Minimum = 0;
_progressSec.Maximum = 60;
_progressSec.Value = DateTime.Now.Second;
this.RegisterName(_progressSec.Name, _progressSec);
NewGrid.Children.Add(_progressSec);
Storyboard newStory = new Storyboard();
DoubleAnimation newAnimation = new DoubleAnimation();
newAnimation.To = 60;
newAnimation.BeginTime = new TimeSpan(DateTime.Now.Second);
newAnimation.RepeatBehavior = RepeatBehavior.Forever;
newAnimation.Duration = new Duration(TimeSpan.FromMinutes(1));
newStory.Children.Add(newAnimation);
Storyboard.SetTarget(newAnimation, _progressSec);
Storyboard.SetTargetProperty(newAnimation, new PropertyPath(ProgressBar.ValueProperty));
newStory.Begin();
Для завершения цикла этому индикатору требуется ровно 1 минута, что не совсем то, чего я хочу. Итак, если я начну его с 40 секунд, потребуется минута, чтобы достичь 60 секунд.
Что я хотел бы, чтобы это начиналось с текущего значения секунд, увеличивалось каждую секунду, и когда оно достигнет 60 секунд, начинайте снова, поэтому, если оно начинается с 40 секунд, требуется 20 секунд, чтобы достичь минуты. Когда оно достигнет минуты, я бы хотел, чтобы оно началось снова (с 0). Конечно, я мог бы просто сказать, что разрабатываю часы / таймер, но подумал, что лучше объяснить, что происходит при запуске кода.
Когда я добавляю значение From в newAnimation, оно всегда начинается с этого значения, а не со значения beginTime.
Есть идеи?
Спасибо.
Комментарии:
1. Способ, которым вы настраиваете
BeginTime
, неверен. Он указывает, в какое время в будущем начнется анимация. Иnew TimeSpan(DateTime.Now.Second)
не имеет никакого смысла.
Ответ №1:
Что ж, если вы хотите, чтобы ваша анимация занимала какое-то другое время, а не одну минуту, вы должны сообщить об этом:
int from = 50;
int to = 60;
newAnimation.From = from;
newAnimation.To = to;
newAnimation.Duration = new Duration(TimeSpan.FromSeconds(to - from));
Комментарии:
1. Первая анимация будет длиться менее минуты (в зависимости от того, когда она начинается) — каждая последующая анимация будет длиться по минуте.
2. Спасибо svick — код работает в том смысле, что в первую минуту для завершения цикла требуется правильное количество времени. Однако после этого он всегда начинается с того же момента (где он начался в первый раз). Как мне заставить его запускать второй и последующие циклы с 0 и занимать 1 минуту для завершения?
Ответ №2:
Благодаря svick я разобрался, как это сделать. Решение приведено ниже:
ProgressBar _progressSec = new ProgressBar();
DoubleAnimation newAnimation = new DoubleAnimation();
Storyboard newStory = new Storyboard();
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
_progressSec.Name = "_progressSec";
_progressSec.Minimum = 0;
_progressSec.Maximum = 59;
_progressSec.Value = DateTime.Now.Second;
this.RegisterName(_progressSec.Name, _progressSec);
NewGrid.Children.Add(_progressSec);
int from = DateTime.Now.Second;
int to = 59;
newAnimation.From = from;
newAnimation.To = to;
newAnimation.Duration = new Duration(TimeSpan.FromSeconds(to - from));
newStory.Completed = new EventHandler(story_Completed);
newStory.Children.Add(newAnimation);
Storyboard.SetTarget(newAnimation, _progressSec);
Storyboard.SetTargetProperty(newAnimation, new PropertyPath(ProgressBar.ValueProperty));
newStory.Begin();
}
void story_Completed(object sender, EventArgs e)
{
int from2 = 0;
int to2 = 59;
newAnimation.From = from2;
newAnimation.To = to2;
newAnimation.Duration = new Duration(TimeSpan.FromMinutes(1));
newStory.Children.Add(newAnimation);
Storyboard.SetTarget(newAnimation, _progressSec);
Storyboard.SetTargetProperty(newAnimation, new PropertyPath(ProgressBar.ValueProperty));
newStory.Begin();
}