我读到WP7使用backstack来表示应用程序的后退导航。
在我的申请中,共有2页
第1页中的timer1的回调用于记录count1 ++值
timer2在第2页的回调用于记录count2 ++值。
问题1 在第1页中,我启动timer1,然后导航到page2。
我认为page1被推到了Backstack并且它是deactive的。但是timer1仍然以count1递增的方式运行??
问题2 在第2页中,我启动timer2并返回第1页。
我认为page2是处置的。但是timer2仍然以count2递增运行?
答案 0 :(得分:4)
页面可能不在视图中,但仍在运行 - 只是没有绘制到屏幕上。当您返回页面时,您拥有的任何变量仍然存在。同样,像DispatcherTimer这样的东西将继续存在,和继续打勾,直到你停止它。
一个直接的问题是,如果你没有保存对你的计时器的引用 - 如果你没有,你将无法阻止它!无论如何,这样的事情会起作用:
protected void override OnNavigatedFrom(Object sender, NavigationEventArgs e){
if (myTimer != null){ timer.Stop();}
e.OnNavigatedFrom(sender,e);
}
protected void override OnNavigatedTo(Object sender, NavigationEventArgs e){
//create, or turn on your timer, etc.
e.OnNavigatedTo(sender,e);
}
这个想法基本上就是你的描述:当离开页面时,“暂停”计时器。当你回来时,重新打开计时器。
问题2:
创建计时器时,变量可能是本地的,但从计时器创建的event
是全局的 - 当需要dispose
时你完成了它。这意味着不仅要停止它,还要删除事件本身 -
myTimer.Tick -= onTimerTick; // where onTimerTick is the name of your Event
最后,
当您的应用获得Deactivated
时,您的计时器就会停止并被终止。您应该确保重新启动/重新创建发生这种情况的任何计时器。如果您要保留计算某些内容,请记住存储计数,以便跟踪用户离开的位置。