2011-04-25 96 views
2

我正在寻找动画进度,因此需要1分钟才能完成一个循环。我的代码是:WPF - 根据时间动画进度条

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值。

任何想法?

谢谢。

+0

您设置'BeginTime'的方式是错误的。它规定了将来动画在什么时候开始播放。而'新TimeSpan(DateTime.Now.Second)'没有任何意义。 – svick 2011-04-25 16:06:35

回答

0

好吧,如果你希望你的动画需要一些其他的时间超过一分钟,你必须告诉它这样:

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

谢谢svick - 我会试试你的代码。 – 2011-04-25 18:54:29

+0

第一个动画将不到一分钟(取决于它的开始时间) - 之后的每个动画将会持续一分钟。 – 2011-04-25 18:55:20

+0

谢谢svick - 代码的工作原理是在第一分钟内花费正确的时间完成一个周期。然而,之后它总是从同一点开始(第一次开始的地方)。我如何获得它在0开始第二个和随后的周期,并花1分钟完成? – 2011-04-26 18:57:06

0

感谢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(); 
    }