【问题标题】:How do I have master details page and a back button on single page如何在单页上有主详细信息页面和后退按钮
【发布时间】:2016-04-21 07:28:55
【问题描述】:

我有应用程序,其中有主详细信息页面,如下所示: 我会为所有页面设置这个(左侧菜单栏设置,登录)静态。由于我使用的是主详细信息页面,因此我使用消息中心在给定的here 页面之间导航:

MessagingCenter.Send(new RedirectClass.OpenDetails(), RedirectClass.OpenDetails.Key);

但现在由于我使用了主详细信息,我无法使用后退按钮向后导航。后退按钮将退出应用程序。假设用户在“页面 A”,当用户点击设置菜单时,用户应该被重定向到设置页面(设置页面都会有左侧菜单),所以点击设置页面上的后退按钮应该将用户重定向到“页面 A” .这没有发生。有什么帮助吗?

MessagingCenter.Subscribe<RedirectClass.OpenDetails>(this, RedirectClass.OpenDetails.Key, (sender) =>
            {
                Detail = new NavigationPage(new Details())
                {
                    BarBackgroundColor = Color.FromRgb(172, 183, 193),
                    BarTextColor = Color.Black,
                    BackgroundColor = Color.White
                };
            });

【问题讨论】:

    标签: c# xamarin.forms


    【解决方案1】:

    而不是覆盖 MessagingCenter 回调中的详细信息页面

    Detail = new NavigationPage(new Details())
    

    您应该使用详细信息页面的导航属性将新页面推送到堆栈顶部

    Detail.Navigation.PushAsync(new Details())
    

    确保您的初始详细信息页面包含在导航页面中

    【讨论】:

    • 这并没有给我顶部的汉堡图标..而是显示一个后退图标
    • 哦,好吧,你也可以这样做。在这种情况下,将 MainPage(主详细信息)包装到导航页面中,您可以将新的主详细信息页面(主页面设置为与往常相同的屏幕,详细信息设置为您想要显示的任何详细信息)到 MainPage.Navigation .PushAsync().
    • @irreal 你能举个例子吗?
    • @irreal 别担心,我们已经解决了这个问题。对于其他人,要保留汉堡包而不是后退按钮,请使用以下命令:App.Current.MainPage = new MainPage { Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType)) };
    【解决方案2】:

    我遇到了同样的问题,Detail.Navigation.PushAsync(itemSelected) 制作了 hamburger 菜单 vanish 我决定将我自己的堆栈数据类型用于主详细信息页面。跟踪和编码有点棘手,但工作正常。

    在应用加载时使用当前详细信息页面初始化它,并为每个选定的项目将新页面推送到堆栈顶部。

    public partial class MyMasterDetailPage: MasterDetailPage
        {
            private Stack navigationStack = new Stack();
            public MyMasterDetailPage()
            {
                InitializeComponent();
                navigationStack.Push(Detail);
                try
                {
                    masterPage.listView.ItemSelected += OnItemSelected;
    
                }
                catch (Exception exc)
                {
    
                    System.Diagnostics.Debug.WriteLine(exc.Message);
                }
    
            }
    

    在同一页面代码后面覆盖OnBackButtonPressed()

            protected override bool OnBackButtonPressed()
            {
                try
                {
                    var lastPage = navigationStack.Pop();
                    if (lastPage.Equals(Detail))
                        lastPage = navigationStack.Pop();
    
                    Detail = (Page)lastPage;
                    IsPresented = false;
    
                   // to avoid app close when complete pop and new page is push on top of it 
                    if (navigationStack.Count == 0) 
                        navigationStack.Push(Detail);
                    return true;
                }
                catch (Exception)
                {
    
                    return base.OnBackButtonPressed();
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多