WPF动画的控制播

到目前为止,已经在事件触发器中使用了一个动作,加载动画的BeginStoryboard动作,然而,一旦创建故事版,就可以使用其他动作控制故事板, 这些动作类都继承自ControllableStoryboardAction类,控制故事版的主要类如下:

PauseStoryboard:停止播放动画并且保持当前位置;

ResumeStoryboard:恢复播放暂停的动画;

StopStoryboard:停止播放动画,并将动画时钟重新设置到开始位置。

SeekStoryboard:跳到动画时间线中的特定位置,如果当前动画正在播放,就继续从新位置播放。如果当前动画是暂停的,就继续保持暂停。

SetStoryboardSpeedRatio:改变整个故事板的SpeedRatio属性值。

SkipStoryboardToFill: 将故事板移动到时间线的终点。FillBehavior属性设置为HoldEnd,动画继续保持最后的值。

RemoveStoryboard: 移除故事板,停止所有正在运行的动画,并将属性返回为原来的、最后一次设置的数值。

 

示例:

首先先搭建好布局样式:

使用Grid布局元素,定义2行,在第二行中定义6列, 每列代表一个动画的运行效果。

<Grid>

        <Grid.RowDefinitions>

            <RowDefinition Height="3*"/>

            <RowDefinition/>

        </Grid.RowDefinitions>

        <Image Name="img" Source="Images\2018-07-02.png"/>

        <Grid Grid.Row="1">

            <Grid.ColumnDefinitions>

                <ColumnDefinition/>

                <ColumnDefinition/>

                <ColumnDefinition/>

                <ColumnDefinition/>

                <ColumnDefinition/>

                <ColumnDefinition/>

            </Grid.ColumnDefinitions>

            <Button Name="btn_start" Content="开始" />

            <Button Name="btn_pause" Content="暂停" Grid.Column="1" />

            <Button Name="btn_resume" Content="恢复" Grid.Column="2"/>

            <Button Name="btn_end" Content="结束" Grid.Column="3"/>

            <Button Name="btn_stop" Content="停止" Grid.Column="4"/>

            <Button Name="btn_remove" Content="移除" Grid.Column="5" />

        </Grid>

 </Grid>

 

接着定义(按钮的)资源样式:

<Window.Resources>

        <Style TargetType="Button">

            <Setter Property="Margin" Value="10"/>

            <Setter Property="FontSize" Value="25"/>

            <Setter Property="FontFamily" Value="楷体"/>

        </Style>

 </Window.Resources>

 

实现动画,定义触发器:

  <Window.Triggers>

        <EventTrigger RoutedEvent="Button.Click" SourceName="btn_start" >

            <BeginStoryboard Name="story"  >

                <!--CurrentTimeInvalidated:动画时钟已经向前移动了一个步长,正在更改动画。当动画开始、停止或结束时也会引发该事件。-->

                <Storyboard TargetName="img" TargetProperty="Opacity" CurrentTimeInvalidated="Storyboard_CurrentTimeInvalidated" Completed="Storyboard_Completed">

                    <DoubleAnimation From="1" To="0" Duration="0:0:6"  AutoReverse="True" />

                </Storyboard>

            </BeginStoryboard>

        </EventTrigger>

       

        <!--暂停动画:将动画暂停,保持在暂停时的时间-->

        <EventTrigger RoutedEvent="Button.Click" SourceName="btn_pause">

            <PauseStoryboard BeginStoryboardName="story"/>

        </EventTrigger>

       

        <!--恢复动画:恢复所暂停的动画 -->

        <EventTrigger RoutedEvent="Button.Click" SourceName="btn_resume">

            <ResumeStoryboard BeginStoryboardName="story"/>

        </EventTrigger>

 

        <!--结束动画:将故事板移动到时间线的终点-->

        <EventTrigger RoutedEvent="Button.Click" SourceName="btn_end">

            <SkipStoryboardToFill BeginStoryboardName="story"/>

        </EventTrigger>

       

        <!--停止动画:将故事版时间线重新设置到开始位置-->

        <EventTrigger RoutedEvent="Button.Click" SourceName="btn_stop">

            <StopStoryboard BeginStoryboardName="story"/>

        </EventTrigger>

       

        <!--移除动画:将所有动画移除-->

        <EventTrigger RoutedEvent="Button.Click" SourceName="btn_remove">

            <RemoveStoryboard BeginStoryboardName="story"/>

        </EventTrigger>

       

    </Window.Triggers>

<Window.Resources>

 

运行效果(设置图片背景的透明度从几秒后变为全透明(隐藏)):

WPF动画的控制播