【问题标题】:Invoke methods at specific times using a Storyboard使用情节提要在特定时间调用方法
【发布时间】:2014-11-01 06:00:48
【问题描述】:

我想利用Storyboard 对象在特定时间调用方法。具体来说;我正在尝试使用具有Fire 方法的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 相关;这个问题(表面上)似乎是一样的,但答案与我想要完成的事情无关。

【问题讨论】:

  • 这里有一个简单的想法:你需要一些InvokeCommandAction(在System.Windows.Interactivity,当然它是在触发某些触发器时调用的。所以你需要使用Storyboard来触发这个触发器(例如通过将某些属性设置为触发触发器的值)。
  • @KingKing 我曾想过类似的事情;似乎有点hackish,但可能是最好的方法。当然比使用计时器并自己处理时间要好。
  • 是的,它有点 hacky,但目前 XAML 迫使我们编写相当多的 hacky 代码(除非我们使用一些自定义库)。
  • 你应该让这个问题在没有任何答案的情况下打开。所以更多的用户会注意到它并想要给出他们的答案(我个人很少点击至少有 1 个答案的问题)。另外,我使用 InvokeCommandAction 的次数不多,但它相当容易使用,您需要一个带有一些已绑定命令的视图模型......即使四处搜索也可以为您提供一些使用它的示例。
  • @KingKing 我当然会去谷歌搜索 :) 谢谢你的帮助;如果不出意外,我很乐意看到为未来用户形成的答案。也许你可以在我已经有另一个之后回答:)

标签: c# wpf storyboard


【解决方案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>

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

【讨论】:

    猜你喜欢
    • 2012-06-19
    • 2013-07-19
    • 1970-01-01
    • 2011-10-06
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多