尽管这里有一些海报声称不是这样,但我也注意到在动画进行时很难访问动画属性的当前值。这是一个很好的解决方案,我使用 WPF 动画在我的模型中随时间插入值。
public class AnimatedDoubleValue : UIElement
{
public event PropertyChangedEventHandler PropertyChanged;
private void FirePropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
private double _value_cache; // this stores the current animated value!
public double Value
{
get { return (double)GetValue(ValueProperty); }
set
{
if (_value_cache == value)
return;
_value_cache = value;
SetValue(ValueProperty, value);
FirePropertyChanged("Value");
}
}
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(AnimatedDoubleValue), new UIPropertyMetadata(0.0, ValuePropertyChanged));
private static void ValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var self = (AnimatedDoubleValue)sender;
var value = (double)e.NewValue;
self.UpdateValue(value);
}
private void UpdateValue(double value)
{
_value_cache = value;
FirePropertyChanged("Value");
}
}
如果我理解正确,OP 想重用 WPF 动画工具进行模拟。这不是一个坏主意,因为根据经过的时间插值并不完全是微不足道的。
这个 AnimatedDoubleValue 甚至不必链接到 WPF 小部件树。它只能用于获取动画值的更新。像这样使用:
var doubleValue = new AnimatedDoubleValue();
var animation=new DoubleAnimation() { From=0, To=100, Duration=TimeSpan.FromSeconds(1) };
animation.SetValue(Storyboard.DesiredFrameRateProperty, 30);
doubleValue.BeginAnimation(AnimatedDoubleValue.ValueProperty, animation, HandoffBehavior.SnapshotAndReplace);
现在要么在 doubleValue 上监听 PropertyChanged 事件,要么随时访问它的 Value 属性。