如何在XAML中删除一个Storyboard(例如,在DataTrigger中使用RemoveStoryboard操作),但保留被动画化的值。与Animatable.BeginAnimation类似:
如果动画的BeginTime为null,则会移除任何当前的动画并保留属性的当前值。
如何在XAML中删除一个Storyboard(例如,在DataTrigger中使用RemoveStoryboard操作),但保留被动画化的值。与Animatable.BeginAnimation类似:
如果动画的BeginTime为null,则会移除任何当前的动画并保留属性的当前值。
void CopyAnimatedValuesToLocalValues(DependencyObject obj)
{
// Recurse down tree
for(int i=0; i<VisualTreeHelper.GetChildrenCount(obj); i++)
CopyAnimatedValuesToLocalValues(VisualTreeHelper.GetChild(obj, i));
var enumerator = obj.GetLocalValueEnumerator();
while(enumerator.MoveNext())
{
var prop = enumerator.Current.Property;
var value = enumerator.Current.Value as Freezable;
// Recurse into eg. brushes that may be set by storyboard, as long as they aren't frozen
if(value!=null && !value.IsFrozen)
CopyAnimatedValuesToLocalValues(value);
// *** This is the key bit of code ***
if(DependencyPropertyHelper.GetValueSource(obj, prop).IsAnimated)
obj.SetValue(prop, obj.GetValue(prop));
}
}
我在使用AnimationTimeline
时遇到了类似的问题。最简单的解决方案是在代码后台捕获Completed
事件,并在调用null
参数之前调用BeginAnimation
以删除动画,获取属性的当前值并将其用于设置。
这将获取最后一个动画值并将其设置。
void OnCompleted( object sender, EventArgs args )
{
// Required to copy latest animated value to local value.
o.SomeValue = o.SomeValue;
o.BeginAnimation( SomeClass.SomeValueProperty, null );
}