【问题标题】:OnNavigatedTo is called two twice on app resumingOnNavigatedTo 在应用程序恢复时被调用两次
【发布时间】:2013-06-03 14:46:42
【问题描述】:

我的 WP8 应用程序出现问题。它使用 MVVM 灯光库来创建 ViewModel,也用于带有 Messages 的页面导航。

现在我的 MainPage 的 OnNavigatedTo 方法出现了一些问题。如果我第一次启动应用程序,它会被调用一次。如果我用后退按钮关闭并重新打开它,它也只会被调用一次。我的 MainPage ViewModel 的构造函数也只会被调用一次。

如果我让应用程序在后台打开并使用“开始”或“搜索”按钮退出,OnNavigatedTo 将被调用两次!构造函数将不再被调用。

我现在的问题是,我正在 OnNavigatedTo 中初始化与服务器的同步。这应该只执行一次,但现在有时会因为 OnNavigatedTo 的双重调用而被调用两次。我对 WP8 应用模型的理解是 OnNavigatedTo 在我进入页面时只会被调用一次。我无法理解这种行为,这让我发疯了。

我没有使用 FastAppResume,只想恢复正常行为。任何建议将不胜感激!我检查了所有可能两次加载页面的调用,但这没有帮助。除了这个问题,我的应用程序的行为也应该如此。否则,我正在寻找一种解决方案来创建一个异步任务,该任务一次只能执行一个。

【问题讨论】:

  • 您是否检查了每个回调的调用堆栈以查看触发双重回调的代码?作为一个 hacky 解决方法,您可以设置一个“初始化”成员变量以避免双重工作。
  • 每次调用 NavigationMode 的值是多少?
  • 是的,我检查了调用堆栈,但它只是在访问我的 onNavigatedTo 之前调用常规 Windows Phone 代码,我的代码中没有任何内容。如果我开始一个新的调试会话并使用主页按钮离开应用程序并从开始屏幕上的磁贴输入它,我会得到以下导航模式:新建、(第一次调用)重置、(第二次调用)刷新。我的理解是 onNavigatedTo 应该只被调用一次?!
  • Oren:我已经尝试过 hacky 解决方法。至少它只会调用一次代码,但后来我遇到了一些其他问题,有时不注册消息处理程序。

标签: windows-phone-8 windows-phone mvvm-light


【解决方案1】:

我以前也遇到过这种情况,是因为消息被多次注册了。

如果没有看到您的代码,解决此问题的最佳方法是将 Messenger.Default.Register 添加到您的 ViewModel 构造函数中,这样它只会被调用一次

【讨论】:

  • 是的,这可能是个问题。我注册和取消注册 Messenger,因为它们会被多次添加或在页面上对延迟消息做出反应。但我需要在 MainPage.xaml.cs 中注册其中一些,因为在 ViewModel 中注册它们会为时已晚:/我需要这个,例如对于我用 Messages 实现的页面导航。但我会调查一下,很高兴听到这个奇怪的问题并不孤单!
  • 在 MainPage 中注册是可以的,但请确保在页面的 OnNavigatingFrom 中取消注册。
  • 好的,很高兴听到这个消息。我在进入或离开页面时注册和注销 Messenger。 Messenger 会不会与其他页面上注册的其他 Messenger 发生冲突?例如页面导航?
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多