重新启动 WPF 故事板

Posted

技术标签:

【中文标题】重新启动 WPF 故事板【英文标题】:Restarting a WPF Storyboard 【发布时间】:2010-10-24 08:44:53 【问题描述】:

从 .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 实际上会在新启动的故事板上播放。因此,即使我已将其移除并停止,原始(来自第一个屏幕)故事板仍然存在并正在播放。

【问题讨论】:

也许这是我的设置。这是更多信息。我有一个带有 storyOverlay 故事板属性的基类。在子类的 ctor 中,我将 storyOverlay = TryFindResource("storyId") as Storyboard;然后,我正在检查 storyOVerlay != null; storyOverlay.Remove(this); 这有什么改变吗? 【参考方案1】:

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

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

Storyboard.Seek method

【讨论】:

另外,需要确保 IsControllable 设置为 true 并标记了相应的包含对象。【参考方案2】:

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

这个方法改变了目标时钟的 CurrentState 停止。

停止的时钟可以通过以下方式重新启动 使用 Begin、Seek 或 SeekAlignedToLastTick 方法。

【讨论】:

这仍然不适合我。在我同时使用 myStory.Remove(this) 和 myStory.Stop(this) 之后,如果场景重新出现在屏幕上,在故事板完成之前,最后一个(最好称之为 Original)故事板仍在播放。【参考方案3】:

抱歉,斯科特,我没注意。您是否尝试在情节提要上设置 FillBehavior。将 FillBehavior 设置为 Stop 会重置动画。不知道为什么 Stop 不这样做...

【讨论】:

【参考方案4】:
<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_name.Remove();

【讨论】:

【参考方案5】:

其他细节可以是:

this.MyAnimation.FillBehavior = FillBehavior.Stop;

【讨论】:

以上是关于重新启动 WPF 故事板的主要内容,如果未能解决你的问题,请参考以下文章

如何为 WPF 故事板中的静态对象设置动画

故事板中的自动布局是全部还是全部?

在WPF中,有没有办法在后面的代码中获取故事板动画值的当前值?

重新启动 Xcode 4.6.1 后未检查 UIViewController 的 UIView 自动调整大小子视图

Xcode 9.2 故事板未正确显示

WPF:Designer无法添加第三方控件。这导致设计人员重新启动