Как предотвратить размещение представления в стеке навигации в Prism

У меня есть случай в Prism, где я поддерживаю SearchContract с комбинацией View/ViewModel.

Проблема заключается в следующем: когда я оставляю панель поиска открытой и выполняю несколько поисков, каждый отдельный поиск помещается в стек навигации. Это означает, что когда пользователь нажимает кнопку «Назад», он видит каждый предыдущий результат поиска, пока не достигнет исходной формы, которая отображалась до начала поиска.

Я хочу, чтобы кнопка «Назад» возвращала на первую страницу перед поиском.

Я вижу пару возможностей:

  1. Измените GoBack, чтобы раскрутить стек до тех пор, пока не будет достигнуто первое представление без поиска.
  2. Сделайте что-нибудь в NavigateFrom, чтобы извлечь текущее представление из стека, прежде чем переходить от активного поиска.
  3. Сделайте то же самое в #2 только на NavigateTo
  4. Использовать регионы?

person S. Hebert    schedule 11.09.2013    source источник


Ответы (1)


Один из подходов заключается в использовании navigation.GoBack() в событии SearchPage.OnNavigatedTo, когда режим навигации «Назад».

public override async void OnNavigatedTo(object navigationParameter, Windows.UI.Xaml.Navigation.NavigationMode navigationMode, System.Collections.Generic.Dictionary<string, object> viewModelState)
{

        if (navigationMode != NavigationMode.Back)
        {
            base.OnNavigatedTo(navigationParameter, navigationMode, viewModelState);
            // ... and so on ...
        }
        else
        {
            if (this.navigationService.CanGoBack())
            {
                // this call must be run on the dispatcher due to using the async-void signature on this event
                await Window.Current.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => this.navigationService.GoBack());
            }
        }
    }

Что здесь интересно, так это необходимость использования Dispatcher. Без него функция .GoBack() не работает. Я не уверен, что это лучший ответ, но это ответ.

person S. Hebert    schedule 12.09.2013