C# 使用情节提要在特定时间调用方法

C# 使用情节提要在特定时间调用方法,c#,wpf,storyboard,C#,Wpf,Storyboard,我想利用情节提要对象在特定时间调用方法。明确地我正在尝试使用焰火用户控件制作焰火表演,该控件具有点火方法。我想创建几个这样的控件,并在特定时间调用它们的Fire方法(就像一个真实的节目) 通常,您会使用序列图像板来随时间设置对象属性的动画是否有办法调用方法? 类似(当然是伪代码): 我曾考虑过在高间隔使用定时器,然后自己进行排序,但这看起来像是一个黑客;特别是当我们有这样一个很好的现有方式做它 注:与相关;这个问题(从表面上看)似乎是一样的,但答案与我试图完成的目标无关。以下是我最终得出的结

我想利用
情节提要
对象在特定时间调用方法。明确地我正在尝试使用
焰火
用户控件制作焰火表演,该控件具有
点火
方法。我想创建几个这样的控件,并在特定时间调用它们的
Fire
方法(就像一个真实的节目)

通常,您会使用
序列图像板
来随时间设置对象属性的动画是否有办法调用方法?

类似(当然是伪代码):


我曾考虑过在高间隔使用
定时器
,然后自己进行排序,但这看起来像是一个黑客;特别是当我们有这样一个很好的现有方式做它


注:与相关;这个问题(从表面上看)似乎是一样的,但答案与我试图完成的目标无关。

以下是我最终得出的结论:

将依赖项属性
NeedsToFire
添加到用户控件(a
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>


这似乎是最容易实现的解决方案;即使它确实需要使用依赖性属性,但它们并不一定是预期的。它还允许重复触发。

这里有一个简单的想法:您需要一些
调用命令
(在
System.Windows.Interactivity
中,它当然是在触发某个触发器时被调用的。因此您需要使用
情节提要
来触发此触发器(例如通过将某些属性设置为触发触发器的值的动画)@KingKing我曾经想到过类似的事情;看起来有点黑客,但可能是最好的方法。当然比使用计时器和自己处理计时要好。是的,这有点黑客,但目前XAML迫使我们编写相当多的黑客代码(除非我们使用一些自定义库)。你应该让这个问题在没有任何答案的情况下打开。这样更多的用户会注意到它,并希望给出他们的答案(我个人很少点击至少有一个答案的问题)。此外,我没有太多使用InvokeCommandAction,但它相当容易使用,您需要一个带有一些已绑定命令的视图模型……甚至四处搜索都可以为您提供一些使用它的示例。@KingKing我当然会用谷歌搜索:)谢谢您的帮助;如果没有其他问题,我很乐意看到未来用户的答案。也许你可以在我已经有了另一个答案后再回答:)
<Storyboard x:Key="FireworksShow">
    <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Firework1" 
                                    Storyboard.TargetProperty="NeedsToFire">
         <DiscreteBooleanKeyFrame KeyTime="0:0:0.5"  Value="True" />
    </BooleanAnimationUsingKeyFrames>
</Storyboard>