Prism с WinRT, как я могу форсировать новый старт при возобновлении после завершения?

Я создаю WinRT-приложение, которое использует близость и WiFi-соединение для одноранговой связи. В результате, когда приложение закрывается, а затем возобновляет работу, мне нужно, чтобы оно началось заново (соединения будут закрыты и не могут быть открыты без взаимодействия с пользователем). Проблема заключается в том, что класс Prism MvvmAppBase, от которого я наследую свое приложение, выполняет то, что заставляет его пытаться выйти из сохраненного состояния (которое не существует), и приложение заканчивается на последнем показанном экране, но есть нет ViewModel, поддерживающего его, и поэтому, в зависимости от вида, он просто будет зависать или зависать.

Я смотрю на это руководство для руководства, и оно говорит, что, если нет способа начать все сначала, но я не могу найти, как на самом деле это сделать. http://msdn.microsoft.com/en-us/library/windows/apps/xx130647.aspx

Я взломал файл App.cs, чтобы попытаться заставить его работать. На самом деле в файле App.cs вообще ничего нет, кроме контейнера для единства и начальной загрузки призмы, а также вызова NavigationService.Suspending() в обработчике события Suspending.

Начальная загрузка выглядит следующим образом, но никогда не вызывается, когда приложение возобновляется с завершения.

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

Если кто-то имел дело с этим раньше и может указать мне правильное направление, я был бы очень признателен.

1 ответ

Решение

Когда приложение Prism WinRT перезапускается после завершения, Prism попытается восстановить состояние приложения, стек навигации фрейма и состояние фрейма до его завершения (что приведет к переходу на последнюю открытую страницу и попытается восстановить любые свойства в представлении. модель, помеченная атрибутом RestorableState.)

Глядя на исходный код MvvmAppBase, кажется, что есть несколько вещей, которые вы можете попытаться предотвратить, чтобы Prism сохранил / восстановил состояние приложения:

  • Создайте конструктор по умолчанию в вашем классе App, который очистит обработчики события Suspending. Конструктор по умолчанию MvvmAppBase регистрируется в этом событии и сохраняет состояние при его поднятии.

  • Переопределите метод OnLaunched базового класса. В нем после выполнения базового метода проверьте, завершено ли предыдущее состояние выполнения. Если это так, вы можете очистить историю навигации NavigationService и перейти на начальную страницу. Операции сохранения и восстановления все равно будут выполняться, поэтому любая зарегистрированная служба все равно будет восстановлена ​​в своем предыдущем состоянии. (Это нельзя сделать в OnLaunchApplication, так как он не вызывается, если состояние приложения было успешно восстановлено.)

  • Кроме того, вы также можете попытаться полностью удалить эту функциональность из класса MvvmAppBase. Однако большинство его методов, связанных с сохранением / восстановлением состояния приложения, являются закрытыми, поэтому вы можете также удалить MvvAppBase, скопировать весь его код в класс приложения и отредактировать его соответствующим образом.

Я не пробовал ни один из перечисленных выше подходов, поэтому я не знаю, могут ли они вызвать какие-либо проблемы, но они могут помочь вам в качестве отправной точки.

Другие вопросы по тегам