等待动画执行完后再继续后面的代码

时间:2022-09-02 22:34:44
我最近想用WPF做一个演示程序执行过程的程序,希望在程序执行一段后,播放动画,演示程序的执行过程,等动画播放完后,再执行后面的代码。这样重复,直到整个程序执行完。

Storyboard myStory = (Storyboard)this.Resources["flashLabel"];
myStory.Begin();
label.Content = "over";

就是希望上面的最后一行代码在动画执行完后再执行,有什么办法吗?各位大神帮帮忙!

10 个解决方案

#2


引用 1 楼 duanzi_peng 的回复:
Complated事件,
https://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.timeline.completed.aspx


我的目的不是在Complated事件中执行代码,比如演示一个冒泡排序的过程,在循环中完成了一次比较后,播放动画,演示这次比较和数据的交换,动画播放时代码暂停执行,动画播放结束后循环继续执行,再次比较则再次重复这一过程,直到排序完成

#3


引用 2 楼 cxdragoon 的回复:
Quote: 引用 1 楼 duanzi_peng 的回复:

Complated事件,
https://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.timeline.completed.aspx


我的目的不是在Complated事件中执行代码,比如演示一个冒泡排序的过程,在循环中完成了一次比较后,播放动画,演示这次比较和数据的交换,动画播放时代码暂停执行,动画播放结束后循环继续执行,再次比较则再次重复这一过程,直到排序完成

用sleep 阻塞主线程,同时播放动画,不过sleep的时间与动画时间要计算一致。

#4


引用
用sleep 阻塞主线程,同时播放动画,不过sleep的时间与动画时间要计算一致。

尝试了这个方法,但是动画同时也被阻塞了

#5


引用 2 楼 cxdragoon 的回复:
Quote: 引用 1 楼 duanzi_peng 的回复:

Complated事件,
https://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.timeline.completed.aspx


我的目的不是在Complated事件中执行代码,比如演示一个冒泡排序的过程,在循环中完成了一次比较后,播放动画,演示这次比较和数据的交换,动画播放时代码暂停执行,动画播放结束后循环继续执行,再次比较则再次重复这一过程,直到排序完成


这个需求如下实现:
1. 播放动画的逻辑
2.排序算法逻辑
3. 第2步的方法应该放到一个线程中去做, while死循环, 每次执行后, 异步播放动画, 调用ManualEvent的Wait方法,  这样在执行动画时, 线程是阻塞的.
4.在播放动画的完成里设置信号量为true, 然后线程会继续下一次执行.
5.每次重新循环时, 信号量置为false.

#6


引用 5 楼 muzizongheng 的回复:
这个需求如下实现:
1. 播放动画的逻辑
2.排序算法逻辑
3. 第2步的方法应该放到一个线程中去做, while死循环, 每次执行后, 异步播放动画, 调用ManualEvent的Wait方法,  这样在执行动画时, 线程是阻塞的.
4.在播放动画的完成里设置信号量为true, 然后线程会继续下一次执行.
5.每次重新循环时, 信号量置为false.


谢谢,尝试了这一思路,确实可行,只是应该如何将参数传递到调用动画的线程中呢?

#7


通过delegate 实现begin invoke传参

#8


通过delegate 的beginInvoke 传参. 

比如:  http://www.cnblogs.com/chucklu/p/4098140.html

#9


综合大家的建议,解决了问题,感谢大家!
只是觉得,如果WPF能够直接提供动画和代码的交互能力就更好了!
结帖!

#10


动画是在主线程执行的,当走到动画的最后一句(startAnimation时,),程序将会分成两步,一边执行动画的开始,一边执行mStory,所以,在startAnimation之后开启一个子线程睡一觉,代码如下:
     startAnimation();
   new Thread() {
public void run() {

SystemClock.sleep(5000);

// 子线程中调用主线程来刷新ui
getActivity().runOnUiThread(new Runnable() {

@Override
public void run() {

mStory();

}
});

};
}.start();

#1


#2


引用 1 楼 duanzi_peng 的回复:
Complated事件,
https://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.timeline.completed.aspx


我的目的不是在Complated事件中执行代码,比如演示一个冒泡排序的过程,在循环中完成了一次比较后,播放动画,演示这次比较和数据的交换,动画播放时代码暂停执行,动画播放结束后循环继续执行,再次比较则再次重复这一过程,直到排序完成

#3


引用 2 楼 cxdragoon 的回复:
Quote: 引用 1 楼 duanzi_peng 的回复:

Complated事件,
https://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.timeline.completed.aspx


我的目的不是在Complated事件中执行代码,比如演示一个冒泡排序的过程,在循环中完成了一次比较后,播放动画,演示这次比较和数据的交换,动画播放时代码暂停执行,动画播放结束后循环继续执行,再次比较则再次重复这一过程,直到排序完成

用sleep 阻塞主线程,同时播放动画,不过sleep的时间与动画时间要计算一致。

#4


引用
用sleep 阻塞主线程,同时播放动画,不过sleep的时间与动画时间要计算一致。

尝试了这个方法,但是动画同时也被阻塞了

#5


引用 2 楼 cxdragoon 的回复:
Quote: 引用 1 楼 duanzi_peng 的回复:

Complated事件,
https://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.timeline.completed.aspx


我的目的不是在Complated事件中执行代码,比如演示一个冒泡排序的过程,在循环中完成了一次比较后,播放动画,演示这次比较和数据的交换,动画播放时代码暂停执行,动画播放结束后循环继续执行,再次比较则再次重复这一过程,直到排序完成


这个需求如下实现:
1. 播放动画的逻辑
2.排序算法逻辑
3. 第2步的方法应该放到一个线程中去做, while死循环, 每次执行后, 异步播放动画, 调用ManualEvent的Wait方法,  这样在执行动画时, 线程是阻塞的.
4.在播放动画的完成里设置信号量为true, 然后线程会继续下一次执行.
5.每次重新循环时, 信号量置为false.

#6


引用 5 楼 muzizongheng 的回复:
这个需求如下实现:
1. 播放动画的逻辑
2.排序算法逻辑
3. 第2步的方法应该放到一个线程中去做, while死循环, 每次执行后, 异步播放动画, 调用ManualEvent的Wait方法,  这样在执行动画时, 线程是阻塞的.
4.在播放动画的完成里设置信号量为true, 然后线程会继续下一次执行.
5.每次重新循环时, 信号量置为false.


谢谢,尝试了这一思路,确实可行,只是应该如何将参数传递到调用动画的线程中呢?

#7


通过delegate 实现begin invoke传参

#8


通过delegate 的beginInvoke 传参. 

比如:  http://www.cnblogs.com/chucklu/p/4098140.html

#9


综合大家的建议,解决了问题,感谢大家!
只是觉得,如果WPF能够直接提供动画和代码的交互能力就更好了!
结帖!

#10


动画是在主线程执行的,当走到动画的最后一句(startAnimation时,),程序将会分成两步,一边执行动画的开始,一边执行mStory,所以,在startAnimation之后开启一个子线程睡一觉,代码如下:
     startAnimation();
   new Thread() {
public void run() {

SystemClock.sleep(5000);

// 子线程中调用主线程来刷新ui
getActivity().runOnUiThread(new Runnable() {

@Override
public void run() {

mStory();

}
});

};
}.start();