【问题标题】:How to start animation, wait for 'X' seconds and then undo animation?如何开始动画,等待'X'秒然后撤消动画?
【发布时间】:2017-11-20 11:41:25
【问题描述】:

我有一个动画,当我想向用户显示一个错误时,它会显示一个文本块。目前,它会在 0.5 秒内下降。有没有办法在 0.5 秒内将其放下,保持 10 秒,然后在 0.5 秒内将其隐藏?我找到了自动反转属性,它负责开始和结束,但我还没有找到一种方法来保持文本块在指定的时间段内显示。任何帮助将不胜感激!

<Window.Resources>
    <Storyboard x:Key="MessageSlide" AutoReverse="True">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="textBlock">
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="50"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</Window.Resources>
<Window.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard Storyboard="{StaticResource MessageSlide}"/>
    </EventTrigger>
</Window.Triggers>

【问题讨论】:

标签: wpf wpf-animation


【解决方案1】:

添加另一个仅保存该值的 KeyFrame:

<DoubleAnimationUsingKeyFrames ... AutoReverse="True">
    <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="50"/>
    <DiscreteDoubleKeyFrame KeyTime="0:0:5.5" Value="50"/>
</DoubleAnimationUsingKeyFrames>

你也可以设置动画的持续时间:

<DoubleAnimationUsingKeyFrames ... Duration="0:0:5.5" AutoReverse="True">
    <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="50"/>
</DoubleAnimationUsingKeyFrames>

【讨论】:

  • 这行得通,但是那个额外的 DiscreteDoubleKeyFrame 属性到底有什么作用呢?我在 msdn 上读到“像 DiscreteDoubleKeyFrame 这样的离散关键帧会在值之间产生突然的跳跃。动画属性在达到关键帧的关键时间之前不会改变,此时动画属性会突然变为目标值。”因此,Easing 属性允许文本块以 0.5 秒的动画向下滑动,而 Discrete 属性使其立即向下滑动(由于 Easing,它不执行任何操作)并在自动反转之前将其保持指定时间?
  • 如前所述,这里它只是保存价值。当然,在缓动框架运行之后。你没试过看看会发生什么吗?
  • 是的,它拥有价值。我还删除了 easing 属性以查看会发生什么,并且动画根本没有运行。这就是为什么我不明白 Discrete 属性在做什么的原因,因为文档使动画看起来好像会在指定时间立即发生。换句话说,在 5.5 秒时,文本块将在没有缓动过渡的情况下可见。
猜你喜欢
  • 1970-01-01
  • 2015-08-11
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 2016-11-26
  • 2023-03-19
相关资源
最近更新 更多