Windows Phone 8: предотвращение добавления PhoneApplicationPage в backstack
У меня есть страница телефона, которая переходит на другую. Есть ли способ предотвратить попадание первой страницы в backstack при переходе ко второй?
Я бы не стал удалять первую страницу из backstack в коде для второй страницы.
3 ответа
Наиболее очевидный способ рода работ:
NavigationService.Navigate(new Uri(...));
NavigationService.RemoveBackEntry();
Но он может потерпеть неудачу - смотрите описанные здесь проблемы с подчинением
Если бы вы удалили запись BackStack на второй странице (и таким образом разбросали знания о поведении первой страницы в контексте навигации), вы бы сделали это в OnNavigatedTo
, который происходит после того, как навигация завершена, и запись помещается в BackStack
, PhoneApplicationPage аналогично имеет OnNavigatedFrom
метод, который также вызывается после завершения навигации (OnNavigatingFrom
вызывается перед навигацией и позволяет отменить). Таким образом, первая страница может удалить себя следующим образом:
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
NavigationService.RemoveBackEntry();
}
Однако этот метод является неполным, так как OnNavigatedFrom
называется не только после успешного Navigate
, но также после нажатия любой из трех кнопок устройства или отображения Launcher
или же Chooser
(от Microsoft.Phone.Task
). В этих случаях текущая страница не будет размещена на BackStack
(Я думаю, именно поэтому BackStack
исправления применяются обычно на других страницах). Поэтому, чтобы исправить описанный выше метод, вы можете проверить, является ли последняя запись такой, какой она должна быть:
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
var entry = NavigationService.BackStack.FirstOrDefault();
if (entry != null && entry.Source.OriginalString.Contains(...))
{
NavigationService.RemoveBackEntry();
}
}
У меня такое же требование при реализации страницы входа. После перехода в аутентифицированную область приложения я хочу удалить страницу входа в систему из backstack.
Чтобы сделать это, я просто выталкиваю стек после вызова навигации из представления входа в систему.
NavigationService.Navigate("/Page2.xaml");
NavigationService.RemoveBackEntry();
Это не требует кода в вашем Page2.xaml.
Нет, нет пути. Почему вы не удалите его, если не хотите, чтобы он был там?