从详细页面的视图我尝试推送新页面,我收到此错误:**
System.InvalidOperationException:页面必须没有父级。
我一直在尝试不同的东西,但没有任何作用。有没有办法将页面推到它上面,我的意思是,detailpage是一个导航页面,但它是一个详细信息页面。非常感谢任何和所有帮助。
我正在使用xamarin表格实验室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>());
答案 0 :(得分:2)
如果您已经有一个NavigationPage,请不要创建另一个来包装您的Detail实例。
Detail = iewFactory.CreatePage<MessagesVM>();
Navigation.PushAsync(ViewFactory.CreatePage<MessageDetailVM>());
答案 1 :(得分:1)
就我而言,使用 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();
}
}
不幸的是,我再次遇到了这个错误,我通过使用此设置将NavigationPage Parent属性设置为null来解决它。
MessagingCenter.Subscribe<NavigationPage>(this, "Navigate", (pageItem) => { pageItem.Parent = null; //solution Detail = pageItem; IsPresented = false; });
答案 2 :(得分:0)
我之前的两个答案都指向正确的方向,所以这只是一个补充。事实上,关键是不再创建NavigationPage / NavigationView。
在我的项目中,我使用静态对象作为MasterDetailPage,NavigationView和Xamarin Forms App类中相应的ViewModel;
我只创建一个实例,如果它们的Value为null,这可能只在应用程序之前关闭时发生(无论是否被用户或操作系统关闭)。如果应用程序仍在运行(恢复),我只是使用现有的对象来恢复状态。
这为我解决了所有这些问题,我希望这对其他人有帮助。
答案 3 :(得分:0)
尝试像这样使用Detail对象的Navigation属性:
Detail.Navigation.PushAsync(page);
要在我的详细信息上推送新页面,请使用以下代码:
注意,我在MasterDetailPage中使用带有页面选项的ListView
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;
}