WPF NavigationService RemoveBackEntry удаляет самую старую запись, а не самую последнюю.

У меня есть довольно простое приложение WPF с несколькими страницами. После отправки формы я хочу перейти на определенную страницу, а затем очистить последнюю навигационную запись, чтобы пользователь не смог затем повторно отправить ту форму, которую он только что отправил.

Однако, когда я вызываю «RemoveBackEntry ()» в службе навигации после перехода на конкретную страницу, она удаляет третью запись (которая в данном случае является самой старой) в заднем стеке, а не страницу, с которой я перехожу. Эта страница остается самой последней записью в заднем стеке при загрузке новой страницы.

Вот мой код, хотя он довольно простой и понятный.

  public void NavigateToNewWorkPage()
    {
        _view.NavigationService?.Navigate(new WorkPage());
        _view.NavigationService?.RemoveBackEntry();
    }

person ghost_mv    schedule 19.02.2017    source источник


Ответы (2)


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

NavigationService.Navigate(..) метод является асинхронным, и когда вы вызываете RemoveBackEntry(), ваше текущее представление еще не находится в журнале задних записей. Таким образом, вы удаляете представление, которое было последней записью назад перед навигацией. Вы можете решить это так:

public void NavigateToNewWorkPage()
{
    if (_view.NavigationService != null)
    {
        _view.NavigationService.Navigated += NavServiceOnNavigated;
        _view.NavigationService.Navigate(new WorkPage());
    }
}

private void NavServiceOnNavigated(object sender, NavigationEventArgs args)
{
    _view.NavigationService.RemoveBackEntry();
    _view.NavigationService.Navigated -= NavServiceOnNavigated;
}

Вы ждете события Navigated, чтобы представление, из которого вы переходите, стало последней обратной записью, а затем удаляете его.

person Pef    schedule 21.02.2017
comment
На самом деле я добавил событие с переходом в свой app.xaml.cs, после чего оно дает мне доступ к заднему стеку. Я пролистываю и удаляю конкретную запись, которую хочу удалить. Отметил ваш как ответ, потому что он был самым близким. Спасибо! - person ghost_mv; 21.02.2017

Я не пробовал, но не могли бы вы попытаться зациклить вызов RemoveBackEntry()? Например.

public void NavigateToNewWorkPage()
{
    _view.NavigationService?.Navigate(new WorkPage());

    while(_view.NavigationService?.CanGoBack == true)
    {
        _view.NavigationService?.RemoveBackEntry();
    }
}
person sclarke81    schedule 20.02.2017