Очистка обратного стека в NavigationService

Я перемещаюсь по разным страницам в своем приложении. После входа в систему я попадаю на домашнюю страницу, откуда начинается навигация. Во время навигации, когда я захожу на домашнюю страницу, я хочу перейти на страницу входа, нажав BackKey, но я могу перейти только на предыдущую страницу. Я мог бы переопределить событие BackKeyPress для перехода на страницу входа, но в LoginPage я должен снова переопределить Backkeypress, иначе при нажатии клавиши возврата появляется цикл между страницей входа и домашней страницей. Можно ли как-то очистить историю навигации?


person master.fake    schedule 23.11.2011    source источник


Ответы (2)


Вы можете использовать NavigationService.RemoveBackEntry: http://msdn.microsoft.com/en-us/library/system.windows.navigation.navigationservice.removebackentry%28v=VS.92%29.aspx

Например, чтобы удалить все записи из стека:

while (this.NavigationService.BackStack.Any())
{
   this.NavigationService.RemoveBackEntry();
}


Кроме того, если вы хотите удалить только предыдущую страницу после проверки ее URI:

var previousPage = this.NavigationService.BackStack.FirstOrDefault();

if (previousPage != null && previousPage.Source.ToString().StartsWith("/MainPage.xaml"))
{
    this.NavigationService.RemoveBackEntry();
}
person Kevin Gosse    schedule 23.11.2011
comment
RemoveBackEntry иногда вызывает исключение NullReferenceException. Некоторая логика внутри навигационной системы нарушена, поэтому в FAS она иногда добавляет фантомные журнальные записи с PageInstance == null. - person Grigory; 01.08.2012
comment
Если бы я хотел удалить только одну страницу, поскольку моя навигация — это A, а затем B, и я хочу удалить A, я бы просто вызвал this.NavigationService.RemoveBackEntry(); в событии OnNavigatedTo? Я бы использовал строку запроса от A до B, чтобы убедиться, что навигация к B была из A. - person Matthew; 08.10.2013

Хотя я знаю, что первоначальный вопрос был для 7, в Windows Phone 8.1 NavigationService больше не существует.

Вот код Windows Phone 8.1

 var previousPage = this.Frame.BackStack.FirstOrDefault();

 if (previousPage != null && previousPage.SourcePageType == typeof(MainPage))
 {
     this.Frame.BackStack.RemoveAt(this.Frame.BackStackDepth - 1);
 }
person Adam    schedule 25.09.2014
comment
Оно делает. Я использую его в своем приложении Windows Phone 8.1 Silverlight. - person Mangesh; 15.12.2014