2014-10-30 69 views
2

我想利用Storyboard对象在特定时间调用方法。特别;我正在尝试制作烟花显示屏,其中Firework用户控件具有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相关;这个问题(面值)似乎是相同的,但答案与我试图完成的事情无关。

+0

这里有一个简单的想法:你需要一些'InvokeCommandAction'(在'System.Windows.Interactivity'中,当然当触发某个触发器时它会被调用。所以你需要使用'Storyboard'来触发这个触发器例如通过将某些属性动画化为触发触发器的值) – 2014-10-30 21:00:42

+0

@KingKing我曾经想过类似的东西,看起来有点冒失,但可能是最好的方式,肯定比使用定时器和自己处理定时更好 – BradleyDotNET 2014-10-30 21:05:27

+0

是的,这有点不好意思,但是现在XAML迫使我们做相当多的hacky代码(除非我们使用一些自定义库) – 2014-10-30 21:08:08

回答

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> 

这似乎是最容易实现的解;即使它确实需要以他们不一定打算使用的方式使用依赖属性。它也允许重复发射。