C# WPF多次触发同一目标的不同情节提要

C# WPF多次触发同一目标的不同情节提要,c#,wpf,xaml,C#,Wpf,Xaml,创建一个纸牌游戏,当游戏开始时,5张牌给一只手。使用故事板,卡片分别从牌组移动到手部位置0-4。有5层,每5个手部位置一层 正在从for循环调用故事,该循环: 从牌组中获得一张新卡。 运行相应的故事。 将新卡显示为真实卡,而不是来自牌组的卡。 将来自卡组的卡重置为其原始位置。 问题是只播放了从for循环调用的最后一个故事。如果我更改循环出现的次数,则故事适用于所有位置,但始终只播放最后一个调用的位置 <Page.Resources> <Storyboard x:Nam

创建一个纸牌游戏,当游戏开始时,5张牌给一只手。使用故事板,卡片分别从牌组移动到手部位置0-4。有5层,每5个手部位置一层

正在从for循环调用故事,该循环:

从牌组中获得一张新卡。 运行相应的故事。 将新卡显示为真实卡,而不是来自牌组的卡。 将来自卡组的卡重置为其原始位置。 问题是只播放了从for循环调用的最后一个故事。如果我更改循环出现的次数,则故事适用于所有位置,但始终只播放最后一个调用的位置

<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>

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

如果我正确理解您的问题,您正在尝试按顺序运行故事板集合,也就是说,下一个故事板需要等待当前故事板的完成;但是,您的代码正在并行地播放故事板集合,结果是,只播放最后一个故事板,而忽略其他故事板

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

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();
    }
}
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();
    }
}