Я занимаюсь разработкой приложения Xamarin.Forms с платформой Prism в архитектуре MVVM. На каждой странице я делаю навигацию с объектом INavigationService следующим образом:

_navigationService.NavigateAsync("PageB");

В нижней левой части приложения у меня есть кнопка «Назад», с которой я могу вернуться на страницы.

У меня есть навигация, как это:

Главная страница -> СтраницаS -> Страница B -> Страница -> Страница

Когда я нахожусь в PageD, мне нужна кнопка, которая переходит на страницу, но мне нужно сохранить часть моей истории навигации, например:

Главная страница -> PageS

Как я могу это сделать?

2
TeoVr81 31 Авг 2017 в 18:33

4 ответа

Лучший ответ

Наконец я решил проблему с этим кодом:

_navigationService.NavigateAsync("/NavigationPage/MainPage/PageA", null,false,false);

Я надеюсь, что это может быть полезно для кого-то.

1
TeoVr81 1 Сен 2017 в 13:59

NavigationService может обрабатывать только Popping одного View с NavigationStack одновременно. Это оставляет вам два варианта для вашего сценария:

  1. _navigationService.NavigateAsync("/MainPage/PageA") это вернет вас к желаемому представлению, но будет воссоздавать MainPage и PageA.

  2. Вероятно, лучший вариант - использовать NavigationParameters вместе с INavigatedAware. Для этого ваша команда Go Back может сделать что-то вроде

    _navigationService.GoBackAsync (новые параметры навигации { {"goBackTo": "PageA"} } ) ;

Затем вы можете обновить ваши ViewModels, чтобы сделать что-то вроде этого:

public class PageBViewModel : BindableBase, INavigationAware
{
    public const string Key = "PageB";

    public void OnNavigatedTo(NavigationParameters parameters)
    {
        switch(parameters.GetNavigationMode())
        {
            case NavigationMode.Back:
                var goBackTo == parameters.GetValue<string>("goBackTo");
                if(!string.IsNullOrWhiteSpace(goBackTo) && goBackTo != Key)
                {
                    _navigationService.GoBackAsync(parameters);
                    return;
                }
                break;
        }
    }
}
0
Dan Siegel 31 Авг 2017 в 15:54

Вам необходимо выполнить абсолютную навигацию. Это делается с помощью префикса вашего URI "/".

_navigationService.NavigateAsync("/MainPage/PageA")

Это сбросит ваш App.MainPage

< Сильный > ======================= ОБНОВЛЕНО ======================= ==

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

public partial class App : PrismApplication
{
    public App(IPlatformInitializer initializer = null) : base(initializer) { }
    protected override void OnInitialized()
    {
        InitializeComponent();
        NavigationService.NavigateAsync("NavigationPage/MainPage");
    }
    protected override void RegisterTypes()
    {
        Container.RegisterTypeForNavigation<MainPage>();
        Container.RegisterTypeForNavigation<PageA>();
        Container.RegisterTypeForNavigation<PageB>();
        Container.RegisterTypeForNavigation<PageC>();
        Container.RegisterTypeForNavigation<PageD>();
        Container.RegisterType<ITsApiService, TsApiService>();
    }
}
0
Pavan V Parekh 1 Сен 2017 в 09:09

Используйте относительную навигацию. Если вы знаете, что на три страницы впереди, вы можете просто перейти относительно целевой страницы.

// using 3x '..'
_navigationService.NavigateAsync("../../..");

/* 

Current stack: MainPage -> PageA -> PageB -> PageC -> PageD

..          -> MainPage -> PageA -> PageB -> PageC
../..       -> MainPage -> PageA -> PageB
../../..    -> MainPage -> PageA  

*/

Вы также можете перейти назад четыре раза, а затем перейти на другую страницу, создав следующий стек навигации (в основном заменяя PageA):

_navigationService.NavigateAsync("../../../../AnotherPage"); // -> MainPage/AnotherPage
1
Daniel Frahn 19 Июл 2019 в 10:11