如何从masterdetailpage中的详细信息页面进行pushasync?

时间:2014-10-09 12:52:20

标签: ios iphone ipad xamarin xamarin.forms

从详细页面的视图我尝试推送新页面,我收到此错误:**

  

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>());

4 个答案:

答案 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;
}