WPF为同一目标多次触发不同的Storyboard

时间:2019-05-11 16:48:17

标签: c# wpf xaml

创建一个纸牌游戏,当游戏开始时,每手提供5张牌。使用情节提要,纸牌分别从卡组到手牌位置0-4。有5个故事,每5个手位置一个。

该故事是通过for循环调用的:

  • 从卡组中获取一张新卡。
  • 运行相应的故事。
  • 显示新卡(真正的卡而不是来自卡组的卡)。
  • 将卡片组中的卡重置到其原始位置。

问题仅在于播放了从for循环调用的最后一个故事。如果更改循环次数,则故事适用于所有位置,但始终只播放最后一个称为的故事。

2xx
<Page.Resources>

    <Storyboard x:Name="sDeckToHandPositionOne" TargetName="HandPositionOne"> 
        <DoubleAnimation Storyboard.TargetProperty="(Image.RenderTransform).(TranslateTransform.X)" To="0" Duration="0:0:1"/>
        <DoubleAnimation Storyboard.TargetProperty="(Image.RenderTransform).(TranslateTransform.Y)" To="0" Duration="0:0:1"/>
    </Storyboard>

    <Storyboard x:Name="sDeckToHandOne" TargetName="HandPositionOne"> 
        <DoubleAnimation Storyboard.TargetProperty="(Image.RenderTransform).(TranslateTransform.X)" To="0" Duration="0:0:1"/>
        <DoubleAnimation Storyboard.TargetProperty="(Image.RenderTransform).(TranslateTransform.Y)" To="0" Duration="0:0:1"/>
    </Storyboard>

</Page.Resources>

注意:这是一个示例,可能包含错字。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则您尝试依次运行Storyboard 的集合,也就是说,下一个情节提要需要等待当前情节提要的完成。但是,您的代码正在同时播放Storyboard的集合,结果是,仅播放了最后一个Storyboard,其他的则被忽略了。

我认为您可以将故事板排成一行,仅播放第一个故事板,并为故事板的Completed事件注册处理程序,在该事件中,您可以播放队列中的下一个故事板。像这样

var storyboardQueue = new Queue<Storyboard>();
storyboardQueue.Enqueue((Resources["sDeckToHandPositionOne"] as Storyboard));
storyboardQueue.Enqueue((Resources["sResetPosition"] as Storyboard)); 
storyboardQueue.Enqueue((Resources["sDeckToHandPositionTwo"] as Storyboard));
storyboardQueue.Enqueue((Resources["sResetPosition"] as Storyboard));
storyboardQueue.Enqueue((Resources["sDeckToHandPositionThree"] as Storyboard));
storyboardQueue.Enqueue((Resources["sResetPosition"] as Storyboard));
//... other storyboards

PlayNextStoryBoard(storyboardQueue);

private void PlayNextStoryBoard(Queue<Storyboard> storyboardQueue)
{
    if (storyboardQueue.Count > 0)
    {
        var sb = storyboardQueue.Dequeue();
        sb.Completed += (o, e) =>
        {
            PlayNextStoryBoard(storyboardQueue);
        };
        sb.Begin();
    }
}