根据时间动画进度条

本文关键字:动画 时间 | 更新日期: 2023-09-27 17:52:42

我正在寻找动画进度,因此需要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();

这个bar正好需要1分钟来完成一个循环,这不是我想要的。所以如果我从40秒开始播放,需要一分钟才能达到60秒。

我想让它从当前的秒值开始,每秒递增,当它达到60秒时,再次开始,所以如果它从40秒开始,它需要20秒才能达到一分钟。当它达到一分钟时,我希望它重新开始(从0开始)。当然,我可以直接说我正在开发一个时钟/计时器,但我认为我最好解释一下当我运行代码时发生了什么。

当我给newAnimation添加一个From值时,它总是从那个值开始,而不是从BeginTime值开始。

任何想法?

谢谢。

根据时间动画进度条

如果你想让你的动画占用一分钟以外的时间,你必须这样告诉它:

int from = 50;
int to = 60;
newAnimation.From = from;
newAnimation.To = to;
newAnimation.Duration = new Duration(TimeSpan.FromSeconds(to - from));

多亏了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();
    }