Ios 如何从masterdetailpage中的detailpage推送异步?
从detailpage的视图中,我尝试推送一个新页面,但出现以下错误:** System.InvalidOperationException:页面不能已经有父级 我一直在尝试不同的东西,但都不管用。有没有办法把页面推到上面,我的意思是,detailpage是导航页面,但它是detailpage。非常感谢您的任何帮助 我正在使用xamarin forms labs ViewFactoryIos 如何从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
//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;
}