我的计划陷入困境。我的程序就像一个专门的计算器,概率,骰子滚轮类型的东西 - 认为自动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循环移动之前完成动画。
答案 0 :(得分:0)
我建议使用BackgroundWorker线程在单独的线程上执行骰子滚动操作。完成动画后 RunWorkerCompleted 方法完成后,您可以继续使用您的应用程序。
e.g。
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 Class示例。