在 Xamarin.forms 中的多个页面之间导航?

Posted

技术标签:

【中文标题】在 Xamarin.forms 中的多个页面之间导航?【英文标题】:Navigating between Multiple pages in Xamarin.forms? 【发布时间】:2017-07-09 09:36:01 【问题描述】:

我有一个内容视图和左侧导航抽屉,它们在 4 个页面上很常见,内容视图包含 4 个图标,可在 4 个不同页面之间导航。我想在所有 4 个页面上保留我的内容视图和左侧导航抽屉。 我创建了一个主详细信息页面并将主页面设置为左侧导航抽屉,并且我每次都在更改详细信息页面。 我得到了例外,因为 android 在多个页面之间导航时一次只能导航页面。 以下是我的 Rootpage 和 ContentView 页面

 public class RootPage : MasterDetailPage
    
        LeftNavigationPanel menuPage;
        public RootPage(string detailSel)
        
            menuPage = new LeftNavigationPanel(); //This is the left navigation class. rename later.
            Master = menuPage;
            if (detailSel.Equals(""))
            

                var detail = new NavigationPage(new Tabpage());
                Detail = detail; //homepage
                detail.Icon = "leftnav.png";
                App.navigation = detail.Navigation;
            
            else if (detailSel.Equals("1"))
            

                var detail = new NavigationPage(new Post());
                Detail = detail; //homepage
               detail.Icon = "leftnav.png";
               App.navigation = detail.Navigation;
             //  System.Diagnostics.Debug.WriteLine("page1: " + Navigation.NavigationStack[Navigation.NavigationStack.Count-1]);

            
            else if (detailSel.Equals("2"))
            
                var detail = new NavigationPage(new TrackTabPage());
                Detail = detail; //homepage
                detail.Icon = "leftnav.png";
                App.navigation = detail.Navigation;
               // System.Diagnostics.Debug.WriteLine("page1: " + Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]);

            
            
    

内容视图

public partial class HomeContentView : ContentView
    
        public HomeContentView()
        
            InitializeComponent();
        
        private async void read_click(Object sender, EventArgs e)
        
            if (!((Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]) is Tabpage))
            

                //await Navigation.PopAsync();
                await Navigation.PushAsync(new RootPage(""));
                // this.Navigation.PopAsync();
            
        
        private async void post_click(Object sender, EventArgs e)
        
            if (!((Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]) is Post))
            
                System.Diagnostics.Debug.WriteLine("page: "+ Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]);
              //  await Navigation.PopAsync();
                await Navigation.PushAsync(new RootPage("1"));


            
        
        private async void track_click(Object sender, EventArgs e)
        
            if (!((Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]) is TrackTabPage))
            
                System.Diagnostics.Debug.WriteLine("page: " + Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]);
              //  await Navigation.PopAsync();
                await Navigation.PushAsync(new RootPage("2"));
            
        
        private void play_click(Object sender, EventArgs e)  
    

【问题讨论】:

【参考方案1】:

您应该使用详细信息页面中的Navigation,因为您将详细信息设置为new NavigationPage()

我通常使用以下代码来获取INavigation 在我的应用程序中导航:

public static INavigation GetNavigation()

    var mdp = Application.Current.MainPage as MasterDetailPage;
    if (mdp != null)
    
        // Return the navigation of the detail-page
        return mdp.Detail.Navigation;
    

    var np = Application.Current.MainPage as NavigationPage;
    if (np != null)
    
        // Page is no MasterDetail-Page, but has a navigation
        return np.Navigation;
    

    // No navigation found (just set the page, instead of navigation)
    return null;

并像下面的例子一样使用它:

var nav = GetNavigation();
if(nav != null)

    await nav.PushAsync(new Tabpage());

else

    // Just set the page, because there is no navigation
    Application.Current.MainPage = new new Tabpage();

    // Or like this
    Application.Current.MainPage = new NavigationPage(new Tabpage());

更新

我稍微改变了我的答案(感谢您的评论,我只是没有意识到这一点)。请勿使用new Rootpage("") 更改页面。这样,您就可以在当前 Navigation 之上创建一个新 Navigation.. 这没有任何意义。

只需将您的页面Push 放到您通过GetNavigation() 获得的当前导航上。

请阅读 Xamarin.Forms 中的 documentation about the navigation pattern 了解更多信息。

【讨论】:

我应该在根页面构造函数中写什么?我可以保持原样吗? 这取决于您希望如何在应用程序中导航。在“正常”情况下,您有一个NavigationPage,您可以在其中推送新页面。这样,用户就可以向后导航。我更新了我的答案 在我的应用程序中..每个主要 4 个页面上有 4 个图标不断放置,负责在 4 个主要页面之间导航...功能就像..您可以从任何页面转到任何页面通过单击相应图标的当前页面..没有一个确定的流程..我该怎么做这样的导航

以上是关于在 Xamarin.forms 中的多个页面之间导航?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xamarin.Forms 中切换页面?

Xamarin.forms 页面之间导航的自定义动画?

从Xamarin Forms中的iOS中的App.OnSleep弹出导航堆栈

xamarin.forms 中的页面生命周期事件

Xamarin.Forms Shell 如何在路由导航中向字符串注入多个不同的值

Xamarin.Forms UWP 中的内存泄漏