Как я могу использовать Navigation.PushAsync из FlyoutPage?

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

Стек навигации должен состоять только из двух страниц. MainPage и любой другой вариант во всплывающем меню.

Я не использую AppShell, это само по себе было головной болью. Я сделал MacGyver всплывающую страницу из различных справочных документов и видео по этому вопросу. У меня есть MainPage с кнопкой, которая PushAsync на страницу 2 без проблем, кнопка «Назад» повсюду.

Всплывающее меню работает в том смысле, что на главной странице есть значок гамбургера, и оно вылетает с пунктами меню. Однако именно здесь он перестает работать. Кажется, единственный способ перейти на новую страницу — использовать:

NewPage = new NavigationPage(new Page2());

Используя этот метод, когда вы нажимаете ссылку на другую страницу, всплывающее окно закрывается, оно загружает страницу, но вместо кнопки «Назад» у него есть значок гамбургера. (Я предполагаю, потому что он не был помещен в стек...)

Я пытался использовать варианты Navigation.PushAsync(new Page2()); безрезультатно. Когда я нажимаю/нажимаю ссылку на страницу во всплывающем меню, ничего не происходит, и всплывающее меню остается открытым. Я убедился, что код действительно работает с использованием точек останова.

Я выложил проект на GitHub если кто-то хочет посмотреть. :)


183
1

Ответ:

Решено

это работает для меня - вероятно, его можно было бы упростить и определенно нуждается в обработке исключений

void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var item = e.CurrentSelection.FirstOrDefault() as FlyoutPageItem;
    
    if (item != null)
    {
        // create the new page
        var newpage = ((Page)Activator.CreateInstance(item.TargetType));

        // get the navigation page
        var nav = (NavigationPage)Detail;
        
        // get the current displayed page
        var page = (ContentPage)nav.CurrentPage;
        
        // navigate to the new page
        page.Navigation.PushAsync(newpage);

        // hide the flyout
        this.IsPresented = false;
    }
}