使用Storyboard在特定时间调用方法

时间:2014-10-30 20:54:45

标签: c# wpf storyboard

我想利用Storyboard对象在特定时间调用方法。特别;我正在尝试使用Firework用户控件进行烟花汇演,该控件具有Fire方法。我想创建其中几个控件并在特定时间调用它们的Fire方法(就像真正的节目一样)。

通常情况下,您可以使用Storyboard为对象的属性设置一段时间的动画。 有没有办法调用方法?

类似的东西(当然是伪代码):

<Storyboard>
    <MethodUsingKeyFrames>
         <MethodKeyFrame KeyTime="0:0:1" TargetName="Firework1" Method="Fire"/>
         <MethodKeyFrame KeyTime="0:0:2.5" TargetName="Firework2" Method="Fire"/>
    </MethodUsingKeyFrames>
</Storyboard>

我考虑过在高间隔使用Timer并自己进行测序,但这似乎是一个黑客攻击;特别是当我们有这么好的现有方式时。

注意:Use a storyboard to call a method in a usercontrol created dynamically相关;问题(面值)似乎是一样的,但答案与我想要完成的事情无关。

1 个答案:

答案 0 :(得分:1)

以下是我最终的目的:

将依赖项属性NeedsToFire添加到用户控件(bool)。然后使用以下函数处理PropertyChanged事件(通过元数据):

public bool NeedsToFire
{
   get { return (bool)GetValue(NeedsToFireProperty); }
   set { SetValue(NeedsToFireProperty, value); }
}

public static readonly DependencyProperty NeedsToFireProperty =
        DependencyProperty.Register("NeedsToFire", typeof(bool), 
            typeof(Firework), new PropertyMetadata(false, HandleNeedsToFire));

private static void HandleNeedsToFire(DependencyObject d, 
                                      DependencyPropertyChangedEventArgs e)
{
   if ((bool)e.NewValue)
   {
      (d as Firework).Fire();
   }
}

最后,使用BooleanAnimationUsingKeyFrames在正确的时间设置此属性:

<Storyboard x:Key="FireworksShow">
    <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Firework1" 
                                    Storyboard.TargetProperty="NeedsToFire">
         <DiscreteBooleanKeyFrame KeyTime="0:0:0.5"  Value="True" />
    </BooleanAnimationUsingKeyFrames>
</Storyboard>

这似乎是最容易实施的解决方案;即使它确实需要以某种方式使用依赖属性,它们也不一定是这样。它还允许重复射击。