在继续之前,如何暂停WPF故事板动画?

时间:2012-05-17 20:20:06

标签: wpf animation storyboard timing

我们有一个从红色到白色混合的彩色动画。目前,这是线性淡化。我们知道我们可以使用Storyboard类的BeginTime等,但这只会延迟整个动画的开始。我们也看过易于放松的东西,但它们似乎也没有用。

具体来说,我们想要保持红色值一秒钟,然后在下一个点从红色淡化为白色。可以在纯XAML中完成吗?如果没有,可以在代码隐藏中手动设置故事板吗? ...或者我们是否必须使用两个单独的故事板并按顺序播放它们?

2 个答案:

答案 0 :(得分:19)

有几种方法可以做到这一点。

关键帧

<Storyboard>
    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Background.Color">
        <DiscreteColorKeyFrame Value="Red" KeyTime="0:0:0" />
        <DiscreteColorKeyFrame Value="Red" KeyTime="0:0:1" />
        <LinearColorKeyFrame Value="White" KeyTime="0:0:2" />
    </ColorAnimationUsingKeyFrames>
</Storyboard>

依次有两个动画:

<Storyboard>
    <ColorAnimation Storyboard.TargetProperty="Background.Color"
                    From="Red" To="Red" Duration="0:0:1" />
    <ColorAnimation Storyboard.TargetProperty="Background.Color"
                    To="White" BeginTime="0:0:1" Duration="0:0:1" />
</Storyboard>

使用自定义缓动功能:

<Storyboard>
    <ColorAnimation Storyboard.TargetProperty="Background.Color"
                    From="Red" To="White" Duration="0:0:2">
        <ColorAnimation.EasingFunction>
            <local:CustomEasingFunction />
        </ColorAnimation.EasingFunction>
    </ColorAnimation>
</Storyboard>

在这种情况下,一个函数显示持续时间的前半部分的转换并保持后半部分的值。因为默认的EasingMode是EaseOut,所以这个函数将向后“播放”。

public class CustomEasingFunction : EasingFunctionBase
{
    public CustomEasingFunction() : base()
    { }

    protected override double EaseInCore(double normalizedTime)
    {
        return (normalizedTime < 0.5)
            ? normalizedTime * 2
            : 1;
    }

    protected override Freezable CreateInstanceCore()
    {
        return new CustomEasingFunction();
    }
}

答案 1 :(得分:1)

根据您编写动画的方式,您可以添加“从”红色“到”红色“的过渡,在开始时需要一秒钟。从技术上讲,动画正在运行,但它没有做任何事情。这可以在纯XAML中完成。