RemoveStoryboard,使其动画回原始状态

时间:2014-01-08 16:19:10

标签: c# .net wpf animation

我有以下代码:

<DataTrigger.EnterActions>
  <BeginStoryboard Name="foo" Storyboard="{StaticResource FadeInCurrentStoryBoard}"/>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
  <RemoveStoryboard BeginStoryboardName="foo"/>
</DataTrigger.ExitActions>
...
<Storyboard x:Key="FadeInCurrentStoryBoard">
  <ColorAnimation Duration="0:0:0.2" To="#75BAFF" Storyboard.TargetProperty="(TextBox.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="MainText"/>
...

问题在于立即删除故事板,但我希望将0.2延迟恢复到原始值。我没有看到任何设置删除时间的属性?

3 个答案:

答案 0 :(得分:3)

我认为最好的办法是创建自己继承自ControllableStoryboardAction的类(如RemoveStoryboard操作一样)并为其添加延迟属性。然后在调用它时,用计时器来表示延迟,当计时器结束时,删除故事板。

RemoveStoryboard类(使用JustDecompile)如下所示:

public sealed class RemoveStoryboard : ControllableStoryboardAction
{
    public RemoveStoryboard()
    {
    }

    internal override void Invoke(FrameworkElement containingFE, FrameworkContentElement containingFCE, Storyboard storyboard)
    {
        if (containingFE != null)
        {
            storyboard.Remove(containingFE);
            return;
        }
        storyboard.Remove(containingFCE);
    }
}

答案 1 :(得分:2)

我认为您要做的是将另一个故事板放在名为FadeOutStoryboard的 ExitActions 中,执行相反的操作,而不是 RemoveStoryboard

RemoveStoryboard 是一种在不再需要故事板而不是反转上一个动画效果时释放内存的方法。

答案 2 :(得分:2)

在我看来,您可以简单地使用ColorAnimation上的AutoReverse属性并将其设置为true。

这将使动画的1次重复包括初始颜色变化,然后反过来,这意味着它将在相同的持续时间内转换回原始值。

<ColorAnimation Duration="0:0:0.2" AutoReverse="True"..