重新启动WPF故事板

时间:2009-05-07 00:50:43

标签: wpf storyboard

从.net代码停止并重新启动故事板的正确方法是什么?

我正在努力......

myStory.Stop(this);

期待随后调用.Begin(this);将从零时间线重新启动,但是,故事板会在停止的地方找到它。

我试过了

.Remove(this);

我试过

.Seek(TimeSpan.Zero); 

也没用。

更多细节......这是我的故事板样本。

<Storyboard x:Key="overlay">
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="textone" Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="0"/>
        <SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="1"/>
        <SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="1"/>
        <SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="0"/>
    </DoubleAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="texttwo" Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="0"/>
        <SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="1"/>
        <SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="1"/>
        <SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="0"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

因此textone中的文本会运行,如果你关闭屏幕并快速返回屏幕,那么texttwo实际上会播放一个新启动的故事板。所以原版(从第一个屏幕开始)故事板仍然在播放,即使我已经删除,并停止它。

5 个答案:

答案 0 :(得分:9)

使用Storyboard.Seek(TimeSpan.Zero)怎么样?与在流中搜索类似,这应该会让您回到动画的开头。

我评论说您还应该确保IsControllable属性设置为true。牢记这一点!

Storyboard.Seek method

答案 1 :(得分:3)

在调用myStory.Begin(this)之前,你需要做myStory.Remove(this)让它从头开始。这是因为调用Storyboard :: Stop只会停止动画时钟,但会使它们保持原样。随后对Begin的调用将简单地作为简历。我同意这有点违反直觉,但如果您阅读文档ClockController::Stop,您会在备注中看到以下内容:

  

此方法更改目标时钟   要停止的CurrentState。

     

可以重新启动已停止的时钟   使用Begin,Seek或   SeekAlignedToLastTick方法。

答案 2 :(得分:0)

对不起斯科特,我没有注意。您是否尝试在故事板上设置FillBehavior。将FillBehavior设置为Stop以重置动画。不知道为什么Stop不会这样做......

答案 3 :(得分:0)

<Storyboard x:Key="overlay">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="textone" Storyboard.TargetProperty="(UIElement.Opacity)">
    <SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="0"/>
    <SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="1"/>
    <SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="1"/>
    <SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="0"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="texttwo" Storyboard.TargetProperty="(UIElement.Opacity)">
    <SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="0"/>
    <SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="1"/>
    <SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="1"/>
    <SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="0"/>
</DoubleAnimationUsingKeyFrames>

 using System.Windows.Media.Animation;

然后创建新的故事板

 Storyboard storyboard_name = (Storyboard)(FindResource("overlay")); 
 storyboard_name.Begin();

故事板“storyboard_name”将开始。

如果你想停止故事板。请尝试这样

storyboard_name.Stop();

如果你想删除storyboard.please试试这个

storyboard_name.Remove();

答案 4 :(得分:-1)

其他细节可以是:

this.MyAnimation.FillBehavior = FillBehavior.Stop;