我有一个简单的故事板动画,如下所示:
<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秒然后再淡出。
为什么这不起作用,这是我正在努力实现的最佳方式吗?
答案 0 :(得分:1)
我认为这里的问题是你有淡入淡出作为单个动画。我可能会做以下事情:
displayPeriod
常数值3.5s(或任何你想要的。用户可配置设置?)。displayPeriod
秒数。需要编写更多代码,但它可能比将动画调整到故事板中的正确位置更简单。
如果您希望在实现此功能时使用一些很酷且令人费解的技术,请查看Reactive Extensions以处理您的通知和计时器事件流。