1

我正在构建一个 WinRT 应用程序,它使用邻近和 WiFi 直接进行点对点通信。结果,当应用程序终止,然后恢复时,我需要它重新开始(连接将被关闭,并且在没有用户交互的情况下无法重新打开)。问题是我继承我的应用程序的 Prism MvvmAppBase 类正在做一些导致它尝试从保存状态(不存在)恢复的事情,并且应用程序最终出现在显示的最后一个屏幕上,但是有没有 ViewModel 支持它,因此根据视图,它只会无响应或崩溃。

我正在查看本指南以获取指导,它说除非有办法重新开始,但我似乎无法找到如何真正做到这一点。 http://msdn.microsoft.com/en-us/library/windows/apps/xx130647.aspx

我一直在研究 App.cs 文件以尝试使其正常工作。除了统一容器和 prism 引导,以及在 Suspending 事件处理程序中调用 NavigationService.Suspending() 之外,App.cs 文件中实际上什么都没有。

bootstrapping 看起来像这样,但是当应用程序从 Termination 恢复时,它永远不会被调用。

    protected override async void OnLaunchApplication(LaunchActivatedEventArgs args)
    {
        await BootStrapper.Config(_container);
        await BootStrapper.RegisterPrismInstances(_container, NavigationService, SessionStateService, FlyoutService);
        NavigationService.Navigate("Main", null);
    }

如果有人以前处理过这个问题,并且可以指出我正确的方向,我将非常感激。

4

1 回答 1

1

Prism WinRT应用程序在被终止后重新启动时,Prism 将尝试恢复应用程序状态、Frame 的导航堆栈和 Frame 在终止前的状态(将导航到最后打开的页面并尝试恢复视图中的任何属性标有RestorableState属性的模型。)

通过查看MvvmAppBase的源代码,您似乎可以尝试一些事情来阻止Prism保存/恢复应用程序状态:

  • 在您的 App 类中创建一个默认构造函数,该构造函数将清除Suspending事件的处理程序。MvvmAppBase的默认构造函数注册到此事件并在引发时保存状态。

  • 覆盖基类的OnLaunched方法。其中,执行完基础方法后,检查之前的执行状态是否为Terminated。如果是这样,您可以清除 NavigationService 的导航历史导航到您的启动页面。保存和恢复操作仍然会执行,所以任何注册的服务仍然会恢复到之前的状态。(这不能在OnLaunchApplication中完成,因为如果应用程序的状态成功恢复,则不会调用它。)

  • 此外,您还可以尝试从MvvmAppBase类中完全删除此功能。但是,它与保存/恢复应用程序状态相关的大多数方法都是私有的,因此您最好删除MvvAppBase,将其整个代码复制到您的 App 类中并相应地对其进行编辑。

我没有尝试过上面列出的任何方法,所以我不知道它们是否会产生任何问题,但它们可能会帮助您作为起点。

于 2013-10-21T16:08:24.480 回答