C# 移除VestoryBoard,使其动画恢复到原始状态

C# 移除VestoryBoard,使其动画恢复到原始状态,c#,.net,wpf,animation,C#,.net,Wpf,Animation,我有以下代码: <DataTrigger.EnterActions> <BeginStoryboard Name="foo" Storyboard="{StaticResource FadeInCurrentStoryBoard}"/> </DataTrigger.EnterActions> <DataTrigger.ExitActions> <RemoveStoryboard BeginStoryboardName="foo"/&g

我有以下代码:

<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的延迟返回到原始值。我看不到任何设置删除持续时间的属性?

我认为您要做的是在ExitActions中放置另一个名为FadeOutStoryboard的情节提要,它执行相反的操作,而不是RemoveStoryboard


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

我认为最好的办法是创建您自己的类,该类继承自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);
    }
}

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

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

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

事实上,@TylerD87-answer可能是对的,您希望重置某些内容的状态,而不是试图破坏故事板。至少你是这么说的。是吗?你说得对。其他答案很好,但这正是我需要的。我怀疑这一点,但希望有一种更独特的处理方式