【问题标题】:Xamarin - TabbedPage navigation error (page must not have a parrent)Xamarin - TabbedPage 导航错误(页面不能有父页面)
【发布时间】:2016-04-05 13:51:05
【问题描述】:

所以我得到了 Page must not already have a parent 异常。当我尝试从一个页面导航到另一个已包含在另一个选项卡中的页面时,就会发生这种情况。在我将页面加载到 TabbedPage 本身之前,我将它们放在一个名为 pages 的列表中,这显然是 TabbedPage 从中获取其子级的地方。我也试图让这个列表与我的导航按钮一起使用。但是每当我尝试使用它们时,我都会遇到异常。这是我加载页面的方式:

private int pageNavCount = 0;
private list<ContentPage> pages = nwe List<ContentPage> (0);

public MainCPage ()
{
    Create ();

    Children.Add(pages[0]);
    Children.Add(pages[1]);
    Children.Add(pages[2]);
}

这是我将页面放入列表的方式:

pages.Add (new ContentPage { 
    Title="Start Pagina", 
    BackgroundImage="@drawable/background.jpg", 
    Content = new StackLayout {
        Padding = 50,
        BackgroundColor = Color.Black,
        Opacity = 0.75,
        Children = {
            //The controls and stuff
        }
    }
});

这就是我如何使用带有导航按钮的页面列表:

private  void NavButtonNext_Clicked (object sender, EventArgs e)
{
    pageNavCount++;
    this.Navigation.PushAsync(pages[pageNavCount]);
}

private  void NavButtonPrev_Clicked (object sender, EventArgs e)
{
    pageNavCount--;
    this.Navigation.PushAsync(ages[pageNavCount]);
}

当我尝试按下按钮时,我得到“页面必须没有父页面”异常。 而且我不想最终为每个页面制作新按钮!有人可以告诉我我在这里做错了什么吗?

【问题讨论】:

  • 谢谢,但我已经看过那个页面了,但我想将我的页面列表与我的导航按钮一起使用,因为我不想手动添加它们!
  • 目前还不清楚您要达到的目标。单击导航按钮时,是否要切换到已包含在另一个选项卡中的另一个页面?还是要在已选择的同一选项卡中导航?
  • 我想导航到已经包含在另一个选项卡中的另一个页面,正如您在我发布的代码中看到的那样。我认为这可以工作
  • 只是一个旁注,但您应该能够删除图像路径的“@drawable/”部分。这是 Android 特有的,会阻止您的代码在 iOS 和 WinPhone 上运行。如果您只是将图像指定为“background.jpg”,那么在 Android 上它将自动在正确的可绘制文件夹中查找。

标签: c# android xamarin xamarin.forms


【解决方案1】:

如果您想导航到另一个已打开的选项卡中的页面,那么您应该执行以下操作:

// you will need a reference to your TabbedPage
pageNavCount--;
tabs.CurrentPage = pages[pageNavCount];

这个blog 有一篇很好的关于以编程方式切换标签的文章。

【讨论】:

  • 我现在应该可以导航了,但是当我使用 pageNavCount 时它说它超出了范围,它说 pageNavCount 的值是 3 而它从 0 开始
  • 这是一个全局共享的值,还是每个页面都有自己的引用?您能否编辑您的问题以显示该值在页面中的初始化方式?
  • 您是在检查您是减少到 0 以下还是增加到页数以上?这种逻辑必须手动实现。
  • 是的,我有一个 if 语句来检查它是处于最大值还是最小值
  • 是的,我在每个页面中都添加了 navButton.Clicked += navButton.Clicked。现在我在我的按钮方法中添加了,这解决了问题。谢谢老兄!
【解决方案2】:

尝试类似:

this.Navigation.PushAsync(new MainCPage(pageNavCount));

在 MainCPage 构造函数中:

public MainCPage (int index)
{

Create ();

Children.Add(pages[0]);

Children.Add(pages[1]);

Children.Add(pages[2]);

CurrentPage = Children[i];

}

这不是最好的架构,但至少你会明白它背后的想法。

【讨论】:

  • 不是很有效,为什么我要在所有页面已经存在时再次添加它们?除此之外,这会消耗不必要的内存。不过还是谢谢你的回答!
【解决方案3】:

我通过将 NavigationPage Parent 属性设置为 null 来解决问题。我正在使用 MasterDetailPage 和 MessagingCenter 在 App 内切换导航。

        MessagingCenter.Subscribe<NavigationPage>(this, "Navigate", (pageItem) =>
        {
            pageItem.Parent = null; // solution
            Detail = pageItem;
            IsPresented = false;
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多