如何使起始动画值立即发生

时间:2011-06-21 08:48:13

标签: c# .net wpf

我是以编程方式在依赖项属性上启动DoubleAnimation(显然是double)。这是代码的截断版本:

// Using a DependencyProperty as the backing store for TestDoubleValue.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty TestDoubleValueProperty =
    DependencyProperty.Register("TestDoubleValue", typeof(double), typeof(MainWindow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsArrange));

void BeginAnimation()
{
    Storyboard sb = new Storyboard();
    DoubleAnimation da = new DoubleAnimation(0, 100, new Duration(TimeSpan.FromMilliseconds(1000)));
    Storyboard.SetTarget(da, this);
    Storyboard.SetTargetProperty(da, new PropertyPath(TestDoubleValueProperty));
    sb.Children.Add(da);
    sb.FillBehavior = FillBehavior.Stop;
    sb.Begin();
    SetValue(TestDoubleValueProperty, 100.0);
}

但是,我想要实现的行为是:

  • 动画的动画应为0到100
  • 在动画开始之前,本地值应为100
  • 在下一次调用ArrangeOverride时,在该属性上调用GetValue(...)应返回0,而不是100,即使本地值为100。

我目前看到的行为如下:

  • 在后续调用ArrangeOverride时,值如下: 100, 0, 0.52647, 0.92353, ...
  • 前100是我不喜欢的。我希望它从0开始。换句话说,我希望本地值为100,但我希望动画值立即从0 开始以后不是几次调用。

我如何实现这种行为?

我目前的想法是,我会做这样的事情:

SetValue(TestDoubleValueProperty, 100.0);
Storyboard sb = new Storyboard();
DoubleAnimation da = new DoubleAnimation(0, 100, new Duration(TimeSpan.FromMilliseconds(1000)));
Storyboard.SetTarget(da, this);
Storyboard.SetTargetProperty(da, new PropertyPath(TestDoubleValueProperty));
sb.Children.Add(da);
sb.Completed += (s, arg) => { sb.Remove(); };
sb.Begin();
SetCurrentValue(TestDoubleValueProperty, 0.0);

这似乎有效,但似乎有点hacky。还有更好的方法吗?

0 个答案:

没有答案