2017-01-31 3 views
0

В моем приложении Xamarin.Forms Prism я использую MasterDetailPage для навигации.Xamarin.Forms Prism - использование навигации для перехода с одной страницы детали на другую

Пока я на одной странице подробностей, я хотел бы перейти на другую страницу подробностей, как если бы я выбрал ее с главной страницы.

Начальная навигация в App.xaml.cs:

protected override void OnInitialized() 
{ 
    ... 
    NavigationService.NavigateAsync("MainPage/RootNavigation/MyFirstPage"); 
} 

При нажатии кнопки быстрого вызова на MyFirstPage, я хотел бы перейти на главную/RootNavigation/MySecondPage. Самое близкое, что я смог достичь, использует абсолютный Ури.

private async void OnShortcutTapped(MyModel sender) 
{ 
    ... 
    await _navigationService.NavigateAsync(new Uri("http://myapp.com/MainPage/RootNavigation/MySecondPage", UriKind.Absolute), navigationParams, null, false); 
} 

Это в основном получает меня, что я хочу, но после навигации таким образом, если бы я сделать Master видимым и выберите пункт меню для MySecondPage, он обновляет страницу детали, как если бы она навигации по странице.

Есть ли лучший способ сохранить эту навигацию, чтобы главная страница знала, что MySecondPage уже отображается, и она не пытается ее перезагрузить?

ответ

1

Хотя ваш шаблон навигации не имеет для меня большого смысла, вы можете добиться того, чего хотите, путем вызова команды навигации в MasterDetailPageViewModel. У вас есть несколько способов сделать это. Вы можете использовать IEventAggregator для отправки сообщения в MasterDetailPageViewModel для навигации, или вы можете использовать CompositeCommand, который вызывает делегатную команду, которая существует в MasterDetailPageViewModel.

Вы можете увидеть образец, используя CompositeCommand здесь: https://github.com/PrismLibrary/Prism-Samples-Forms/tree/master/UsingCompositeCommands

Вы также можете увидеть, как отправлять сообщения в этом образце, который я дал на конференции Xamarin Evolve: https://github.com/brianlagunas/Evolve2016SamplesAndSlides

Другим вариантом было бы просто вызовите команду навигации из App.Current.MainPage ViewModel из вашего кода MyFirstPage.

+0

Я внедрил IEventAggregator для навигации по MainPageViewModel к данному URI (RootNavigation/MySecondPage), но он, похоже, имеет тот же конечный результат, что и мой абсолютный URI. После того, как событие обрабатывает навигацию, вы выбираете элемент MySecondPage из мастера, MySecondPage.OnNavigatedFrom и MySecondPage.OnNavigatedTo вызываются так, как будто он загружает новую страницу. – jkh

+0

Да, этого и следовало ожидать. Призма или Ксамарин кэшируют эти страницы. Преимущество здесь в том, что вы не воссоздаете MasterDeatialPage. –

+0

ОК, так что это самое близкое, что может быть достигнуто для имитации фактического выбора мастера? Он отличается тем, что на самом деле выбор мастера дважды подряд не приводит к OnNavigatedFrom/OnNavigatedTo, поскольку он действует так, как будто второй выбор игнорируется. – jkh

Смежные вопросы