0

我的程序进退两难。我的程序就像一个专门的计算器,概率,掷骰子类型的东西——想想自动 RPG 滚动。目前它在一个窗口上的设置方式具有所有数据并进行所有计算等,但我还有第二个可选窗口,它纯粹用于动画,所以它不仅仅是文本输出。现在动画窗口工作正常,我的“数据窗口”也没有更好的术语,当我想从我的数据窗口更新我的动画窗口并使数据窗口等待动画完成时,问题就变成了。

这是设置:数据窗口运行一个方法,在该方法中它告诉动画窗口更新图像并运行故事板动画方法。这样可行。现在数据窗口运行一个具有 foreach 循环的方法,在该 foreach 循环中它告诉动画窗口更新它们的图像并为当前的 foreach 项目运行动画。简单吧?那么问题是数据窗口不耐烦并继续告诉动画窗口运行它的动画 - 而且由于动画应该回收图像对象,只是使用新源,使用该动画,动画窗口会忘记所有命令从数据窗口只运行最后一个,而不是一个接一个地运行。

所以基本上我的问题是 - 在继续 foreach 循环之前,如何让我的数据窗口等待动画窗口完成他们的故事板动画?

我的代码的简化版本是这样的 -

//In my data window
foreach (var item in Weapons)
{
try
            {
                string weapons = "\\" + weapon.Name + ".png";
                AnimationWindow.img_Pojectile.Source = new BitmapImage(new Uri(Directory.GetCurrentDirectory() + "\\Images" + weapons));
            }
            catch
            {
                try
                {
                    string weapons = "\\" + weapon.Type + ".png";
                    AnimationWindow.img_Pojectile.Source = new BitmapImage(new Uri(Directory.GetCurrentDirectory() + "\\Images" + weapons));
                }
                catch
                {
                    AnimationWindow.img_Pojectile.Source = new BitmapImage(new Uri(Directory.GetCurrentDirectory() + "\\Images\\Default.png"));
                }
            }

    AnimationWindow.Fire(item.Name);
//More code stuff I have to repeat here, all the calculations and such...
}

//In my AnimationWindow
public void Fire(string name)
{
    img_Pojectile.Source = new BitmapImage(new Uri(Directory.GetCurrentDirectory() + "\\" + name + ".png"));
    Storyboard sb = new Storyboard();
    DoubleAnimation anim = new DoubleAnimation(0, 120, TimeSpan.FromSeconds(seconds));
    TranslateTransform trans = new TranslateTransform();
target.RenderTransform = trans;

anim.AutoReverse = true;
anim.RepeatBehavior = RepeatBehavior.Forever;
anim.BeginTime = TimeSpan.FromSeconds(offset);

Storyboard.SetTarget(anim, target);
Storyboard.SetTargetProperty(anim, new PropertyPath("(FrameworkElement.RenderTransform).(TranslateTransform.Y)"));

sb.Completed += (o, s) => {
//Figured a completed event might help, so far no luck
};

sb.Children.Add(anim);
sb.Begin();
}

所以在这个更简单的版本中,我想要的是动画在我的 foreach 循环继续之前完成。

4

1 回答 1

0

我建议使用 BackgroundWorker 线程在单独的线程上执行掷骰子操作。当动画完成后RunWorkerCompleted方法完成时,您可以在您的应用程序中继续。

例如

var bg = new BackgroundWorker();
            bg.DoWork += (s, e) =>
                             {
                                 // Do Dice roll animation
                                 // Disable data window 

                             };

            bg.RunWorkerCompleted += (s, e) =>
                            {
                               // Rice roll complete do other stuff
                               // Enable the data window
                            };

            bg.RunWorkerAsync();

另请查看 MSDN BackgroundWorker 类示例。

于 2014-08-07T07:45:08.753 回答