如何让一个窗口等待另一个窗口继续

本文关键字:窗口 一个 等待 另一个 继续 | 更新日期: 2023-09-27 18:16:57

我的程序进退两难。我的程序就像一个专门的计算器、概率、掷骰子之类的东西——想想自动的RPG滚动。它现在的设置方式是在一个窗口上它有所有的数据,做所有的计算等等,但是我还有第二个,可选的窗口,它纯粹是用于动画的,所以它不仅仅是文本输出。现在动画窗口工作得很好,就像我的"数据窗口"一样(因为没有更好的术语),当我想从数据窗口更新动画窗口并让数据窗口等待动画完成时,问题就出现了。

设置如下:数据窗口运行一个方法,在这个方法中它告诉动画窗口更新图像并运行一个storyboard动画方法。这工作。现在data window运行一个有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循环开始之前动画结束

如何让一个窗口等待另一个窗口继续

我建议使用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类示例。