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

Mar*_*eIV 8 wpf animation timing storyboard

我们有一个从红色到白色混合的彩色动画.目前,这是线性淡化.我们知道我们可以使用Storyboard类的BeginTime等,但这只会延迟整个动画的开始.我们还研究了易用性/易用性方面,但它们似乎也没有用.

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

LPL*_*LPL 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>
Run Code Online (Sandbox Code Playgroud)

有两个动画的顺序:

<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>
Run Code Online (Sandbox Code Playgroud)

具有自定义缓动功能:

<Storyboard>
    <ColorAnimation Storyboard.TargetProperty="Background.Color"
                    From="Red" To="White" Duration="0:0:2">
        <ColorAnimation.EasingFunction>
            <local:CustomEasingFunction />
        </ColorAnimation.EasingFunction>
    </ColorAnimation>
</Storyboard>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,一个函数显示持续时间的前半部分的转换并保持后半部分的值.因为默认的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 啊哈!我弄清楚为什么你从1变为0.你将EasingMode设置为默认值EaseOut,它指出从'Ease'返回的值应该是100%插值减去EaseInCore函数的结果,因此你认为它从1变为0.如果你愿意的话,双重否定.但是,因为该函数被称为EaseInCore,为了保持一致性,它应该用从0到1的时间写入,然后EasingMode必须显式设置为EaseIn,但是再次,这将更清楚,因为该函数将表示时间已过去正确. (2认同)