我有一个故事板,我利用到动画的一些照片,我想每一个动画,其中包括一些计算,然后运行另一个动画后执行一些操作,所以我相信我应该用故事板的完成的事件MyStoryboard.Completed += storyboard_Completed;
我很好奇的是,我应该开始在当前的故事板的下一个动画Storyboard_Completed Event
? 而且,是否有任何影响,如果我使用Application.Current.Dispatcher对象启动的第一个动画在一个单独的线程?
如果我叫了StoryBoard.Begin()在使用Application.Current.Dispatcher一个单独的线程,并在Storyboard_Completed事件后,也会在UI线程中调用? 在这种情况下,我还需要另一个调度程序调用内包下一个动画?
private void Story_Completed(object sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke((Action)delegate()
{
SomeNewStoryBoardAnimation.Begin();
}
}
它是否正确? 还是有更好的方法来检查,如果一个故事板已经结束,开始下一组后计算和分镜动画权?
我想用一个单一的背景工人到处理器所有的动画和计算顺序的,但我也想知道如何“等待”动画开始对下一集的计算和动画前完成。 这是正常的一个BackgroundWorker拥有Thread.sleep
在等待动画完成?
你可以换一个故事板任务对象,并等待其完成。
下面是示例代码,说明如何做到这一点,从拍摄的优秀位的博客文章由Morten Nielsen的:
public static class StoryboardExtensions
{
public static Task BeginAsync(this Storyboard storyboard)
{
System.Threading.Tasks.TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
if (storyboard == null)
tcs.SetException(new ArgumentNullException());
else
{
EventHandler<object> onComplete = null;
onComplete = (s, e) => {
storyboard.Completed -= onComplete;
tcs.SetResult(true);
};
storyboard.Completed += onComplete;
storyboard.Begin();
}
return tcs.Task;
}
}
从本质上讲,你要创建一个扩展方法,它返回一个任务对象的信号故事板完成。 通过这种方式,你会得到这样的一些不错的流体语法:
//Start the storyboard and asynchronously await completion...
await myStoryboard.BeginAsync();
//Do my other stuff here, after the storyboard completes...
使用Storyboard.Completed事件应适用于您的目的。 该Storyboard.Completed事件处理程序启动时机的UI线程上,所以你不应该需要调用Application.Current.Dispatcher.Invoke仍然发射第二故事板。
不应该有任何的影响,如果你调用使用Application.Current.Dispatcher.Invoke原来Storyboard.Begin。 这不会推出一个新的线程故事板动画。 它将异步调用主UI线程上的动画。 无论您拨打开始在UI线程你自己或你是否使用Application.Current.Dispatcher.Invoke做到这一点,最终的结果应该是一样的。 当故事板完成你完成事件处理程序会火,你可以执行你的计算和消防断下的故事板。
见过去那样,因为它运行在UI线程上的事实已经计时器被用于故事板的一些讨论以下问题:
什么是使用故事板作为定时器的意义呢?
此外,这是可能是你所描述的特定情况下矫枉过正,但如果你需要协调一串连续的,异步操作,您可以使用无功扩展:
http://msdn.microsoft.com/en-us/data/gg577609.aspx
下面的文章包括连续故事板的例子(虽然文章很老的语法可能已经改变):
http://www.wintellect.com/cs/blogs/jlikness/archive/2010/08/22/coroutines-for-asynchronous-sequential-workflows-using-reactive-extensions-rx.aspx
文章来源: WPF: What is the correct way to wait for a storyboard animation to complete before performing an operation