2

我读到 WP7 使用 backstack 来表示应用程序的后退导航。

在我的应用程序中,有 2 页

  1. 第1页:有局部变量int count1,和DispatcherTimer timer1
  2. 第2页:有局部变量int count2,和DispatcherTimer timer2

page1 中 timer1 的回调用于记录 count1++ 值

page2 中 timer2 的回调用于记录 count2++ 值。

问题 1 在第 1 页中,我启动 timer1,然后导航到第 2 页。

我认为 page1 被推到后台堆栈并且它处于非活动状态。但是 timer1 仍然在 count1 递增的情况下运行?

问题2在page2 中,我启动timer2 并返回page1。

我认为 page2 是处置。但是 timer2 仍然在 count2 递增的情况下运行?

4

1 回答 1

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,您的计时器将停止并终止。您应该确保在发生这种情况时重新启动/重新创建您拥有的任何计时器。如果您要对某些内容进行计数,请记住存储计数,以便您可以跟踪用户离开的位置。

于 2012-10-23T15:51:15.157 回答