【问题标题】:MasterDetailPage - can't find any way to target 'detail' page windowMasterDetailPage - 找不到任何方法来定位“详细”页面窗口
【发布时间】:2020-01-02 01:43:09
【问题描述】:

我创建了一个主从页面

我正在将项目列表加载到“详细”框架/窗口中

我想用一个模板/视图替换该页面的内容,该模板/视图永远不会作为菜单项中的项目存在

我尝试替换加载页面的 MainPage 和 Navigation,但您丢失了 Master Detail 上下文 - 菜单

请有人告诉我,为了在主详细信息的上下文中用我选择的一个替换当前页面,我调用了什么?

这不起作用,例如 - 它会删除 MasterDetail 菜单

 Navigation.PushAsync(new Arcade.Index());

我创建 MasterDetailPage 几乎是让 Visual Studio 生成它。我是在成功登录后设置的,像这样:

            var welcome = new Pages.Welcome();


            Application.Current.MainPage = welcome;

这是 Welcome 的 XAML 的摘录

 <MasterDetailPage.Master>
    <pages:WelcomeMaster x:Name="MasterPage" />
    </MasterDetailPage.Master>
    <MasterDetailPage.Detail>
 <NavigationPage>
    <x:Arguments>
    <pages:Index />
   </x:Arguments>
 </NavigationPage>

我已将此添加到 Welcome 的代码中

        InitializeComponent();
        MasterPage.ListView.ItemSelected += ListView_ItemSelected;

        this.Detail = new NavigationPage(new Arcade.Index());

尽管如此,当我稍后调用它时,MasterDetail 菜单消失了

    ((MasterDetailPage)Application.Current.MainPage).Detail = new Arcade.Index();

【问题讨论】:

  • 设置MasterDetailPage的Detail属性
  • 我已经阅读了几次,但无法从我加载的视图中访问它。我加载的页面与我能找到的 Master Detail 之间没有任何关系
  • 要么使用 Navigation 导航到 Detail 框架内的新页面,要么从 App.Current.MainPage 引用当前 MasterDetail,或者在创建详细信息页面时手动传递对 MasterDetail 的引用
  • App.Current.MainPage 替换了整个窗口,我看不到通过该方法访问现有 MasterDetail 的任何方式。我在示例中给出的导航替换了整个窗口。第三种方法看不懂?

标签: xamarin xamarin.forms


【解决方案1】:

在您的 App.xaml.cs 添加静态方法,然后您可以使用它在您的代码中导航

    public static void SetDatailPage(Page page)
    {
        if (App.Current.MainPage is MasterDetailPage)
        {
            var masterPage = (MasterDetailPage)App.Current.MainPage;
            masterPage.Detail = new NavigationPage(page);
        }
    }

并像这样使用它

App.SetDatailPage(new YourPageYouWannaNavigateTo());

【讨论】:

    【解决方案2】:

    1 - 使用App.Current.Mainpage

    var md = (MasterDetailPage)App.Current.MainPage;
    md.Detail = new MyPage();
    

    2 - 使用导航

    当您最初创建详细信息时,将其包装在 NavigationPage

    this.Detail = new NavigaitionPage(new Page1());
    

    然后,Page1 可以在 Detail 窗格中导航到 Page2

    Navigation.PushAsync(new Page2());
    

    3 - 显式传递对MasterDetailPage的引用

    // when you create Page1, pass a reference to the MasterDetailPage
    // you will also need to modify Page1's constructor
    this.Detail = new Page1(this);
    

    【讨论】:

    • 我非常感谢您的回复,但我似乎遗漏了一些基本的东西。例如,您在上面放置的这个变体仍然用我要加载的页面替换整个窗口 - 所以我丢失了菜单。这些选项都不能让我加载保留 ​​MasterDetail 菜单的页面。 ((MasterDetailPage)Application.Current.MainPage).Detail = (new Arcade.Index());
    • 那你做错了什么。如果您将 MainPage 设置为 MasterDetailPage,然后您稍后更新 Detail 属性,则只会替换 Detail,而不是 Master。
    • 您可能会丢失触发母版页外观的工具栏按钮(在手机上)- 是这样吗?
    • Jason,再次感谢您的帮助,但我已经返回并编辑了我上面的帖子,向您展示了我的更多代码,希望您能发现一些东西
    • 你怎么知道大师消失了?您通常如何切换它?手势、工具栏按钮还是什么?
    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2014-05-18
    • 2018-03-26
    • 2012-03-25
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多