将故事板动画向后追溯到特定点然后播放

时间:2012-01-23 04:04:09

标签: .net wpf animation storyboard

我有一个简单的故事板动画,如下所示:

 <Window.Resources>
    <Storyboard x:Key="fader">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
            <SplineDoubleKeyFrame KeyTime="0:0:0" Value="0"/>
            <SplineDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
            <SplineDoubleKeyFrame KeyTime="0:0:4" Value="1"/>
            <SplineDoubleKeyFrame KeyTime="0:0:6" Value="0"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</Window.Resources>

正如你所看到的,它会使目标消失,等待3.5秒,然后逐渐消失。我正在事件发生时出现的通知器窗口中使用它。

当事件发生时,通过从代码中调用以下内容来完美地工作:

board = (Storyboard)FindResource("fader");
board.Begin(this);

但是,我正在尝试处理通知窗口已经显示时发生第二个事件的情况。在这种情况下,我正在寻找的行为是修改窗口的内容以反映第二个事件(简单)并将故事板“倒回”到其生命周期的0.5秒,即。就在它出现之后。

换句话说,第二个事件应该导致淡出发生在第二个事件发生后的3.5秒,即使窗口已经存在0到6秒之间的任何事情。

我试图通过检测窗口的不透明度来做到这一点,如果它是&gt; 0则调用以下内容:

board.Seek(this,TimeSpan.FromSeconds(0.5),TimeSeekOrigin.BeginTime);

然而,这似乎没有做任何事情,即使我反复触发事件,窗口内容也会改变,但是通知程序会尽职尽责,等待3.5秒然后再淡出。

为什么这不起作用,这是我正在努力实现的最佳方式吗?

1 个答案:

答案 0 :(得分:1)

我认为这里的问题是你有淡入淡出作为单个动画。我可能会做以下事情:

  1. 将动画拆分为两个:淡入和淡出。
  2. 定义displayPeriod常数值3.5s(或任何你想要的。用户可配置设置?)。
  3. 当收到通知时,触发一个事件。如果是第一个通知,请运行淡入动画。如果不是第一个通知,请转到5.
  4. 启动计时器,倒数displayPeriod秒数。
  5. 如果在计时器到期之前收到另一个通知,请将其取消并重新启动。
  6. 当计时器最终到期时,运行淡出动画。
  7. 需要编写更多代码,但它可能比将动画调整到故事板中的正确位置更简单。

    如果您希望在实现此功能时使用一些很酷且令人费解的技术,请查看Reactive Extensions以处理您的通知和计时器事件流。