簡體   English   中英

如何使一個窗口在繼續之前等待另一個窗口?

[英]How to make one window wait for another before continuing?

我的程序有兩難選擇。 我的程序就像一個專門的計算器,概率,擲骰子式的東西-想想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循環繼續之前完成動畫。

我建議使用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類示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM