Ios 如何从masterdetailpage中的detailpage推送异步?

Ios 如何从masterdetailpage中的detailpage推送异步?,ios,iphone,ipad,xamarin,xamarin.forms,Ios,Iphone,Ipad,Xamarin,Xamarin.forms,从detailpage的视图中,我尝试推送一个新页面,但出现以下错误:** System.InvalidOperationException:页面不能已经有父级 我一直在尝试不同的东西,但都不管用。有没有办法把页面推到上面,我的意思是,detailpage是导航页面,但它是detailpage。非常感谢您的任何帮助 我正在使用xamarin forms labs ViewFactory //app.cs GetMainPage var rootPage = ViewFactory.CreateP

从detailpage的视图中,我尝试推送一个新页面,但出现以下错误:**

System.InvalidOperationException:页面不能已经有父级

我一直在尝试不同的东西,但都不管用。有没有办法把页面推到上面,我的意思是,detailpage是导航页面,但它是detailpage。非常感谢您的任何帮助

我正在使用xamarin forms labs ViewFactory

//app.cs GetMainPage
var rootPage = ViewFactory.CreatePage<HomeVM>();

//in HomeView.xaml.cs, setting the detailpage to the list of messages
Detail = new NavigationPage(ViewFactory.CreatePage<MessagesVM>());

//This is in the MessagesView to show an individual message with a back button to the list of messages
Navigation.PushAsync(ViewFactory.CreatePage<MessageDetailVM>());
//app.cs GetMainPage
var rootPage=ViewFactory.CreatePage();
//在HomeView.xaml.cs中,将detailpage设置为消息列表
Detail=newNavigationPage(ViewFactory.CreatePage());
//这是在MessagesView中,通过返回按钮显示单个消息到消息列表
Navigation.PushAsync(ViewFactory.CreatePage());

如果您已经有了NavigationPage,请不要创建另一个来包装您的详细信息实例

Detail = iewFactory.CreatePage<MessagesVM>();
Navigation.PushAsync(ViewFactory.CreatePage<MessageDetailVM>());
Detail=iewFactory.CreatePage();
Navigation.PushAsync(ViewFactory.CreatePage());

就我而言,我使用MessagingCenter时也出现了同样的错误,但也通过在页面关闭/OnDisappearing后取消订阅/处理来解决

希望能有帮助

    public partial class MainPage : MasterDetailPage
    {
    public MainPage()
    {
        InitializeComponent();

        MasterBehavior = MasterBehavior.Popover;

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

        MessagingCenter.Subscribe<string>(this, "Logout", (s) =>
        {
            Application.Current.MainPage = new LoginPage("", "");

        });
    }

    protected override void OnDisappearing()
    {
        MessagingCenter.Unsubscribe<NavigationPage>(this, "Navigate");
        MessagingCenter.Unsubscribe<string>(this, "Logout");
        base.OnDisappearing();
    }
    }
公共部分类主页面:MasterDetailPage
{
公共主页()
{
初始化组件();
MasterBehavior=MasterBehavior.Popover;
MessagingCenter.Subscribe(此“导航”(pageItem)=>
{
细节=页面项;
IsPresented=假;
});
MessagingCenter.Subscribe(此“注销”,s)=>
{
Application.Current.MainPage=新登录页面(“,”);
});
}
受保护的覆盖无效OnDisappearing()
{
取消订阅(此“导航”);
取消订阅(此“注销”);
base.OnDisappearing();
}
}
不幸的是,我再次遇到了这个错误,我通过将NavigationPage父属性设置为null来解决这个问题

MessagingCenter.Subscribe(此“导航”,页面项)=>
{
pageItem.Parent=null;//解决方案
细节=页面项;
IsPresented=假;
});

我前面的两个答案都指向了正确的方向,所以这只是一个补充。实际上,关键是不要再次创建NavigationPage/NavigationView

在我的项目中,我在Xamarin Forms App类中使用MasterDetailPage、NavigationView和相应的ViewModels的静态对象

我只在实例的值为null时创建实例,这很可能只发生在之前关闭应用程序的情况下(无论是由用户还是操作系统关闭)。如果应用程序仍在运行(已恢复),我只是使用现有对象来恢复状态


这为我解决了所有这些问题,我希望对其他人有所帮助。

尝试使用细节对象的导航属性,如下所示:

Detail.Navigation.PushAsync(第页)

要在我的详细信息上推送新页面,我使用以下代码:

注意,我在MasterDetailPage中使用带有页面选项的ListView


消息或消息详细信息是否已包装在NavigationPage中?您正在某处创建嵌套的NavigationPage,这导致了错误。我不确定是否使用“包装在NavigationPage中”。你能分享一些相同的示例代码吗?谢谢@Jason,我已经按照你提到的方法做了,但是在消息详细信息页面上,我不需要使用导航栏。相反,我在顶部有一个菜单,可以将用户重定向到消息页面。所以,当用户在那个时处于消息详细信息页面上时,若用户在那个时点击顶部菜单,我就会得到那个错误。
        MessagingCenter.Subscribe<NavigationPage>(this, "Navigate", (pageItem) =>
        {
            pageItem.Parent = null; //solution
            Detail = pageItem;
            IsPresented = false;
        });
private void ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    var item = e.SelectedItem as MainMenuItem;
    if (item == null)
        return;

    var page = (Page)Activator.CreateInstance(item.TargetType);

    //Detail = new NavigationPage(page);
    Detail.Navigation.PushAsync(page);

    IsPresented = false;
    MasterPage.ListView.SelectedItem = null;
}