【问题标题】:How to navigate in a prism master-detail Xamarin.Forms application如何在 prism 主从 Xamarin.Forms 应用程序中导航
【发布时间】:2017-10-06 00:34:41
【问题描述】:

我正在创建我的第一个 Prism/XF 应用程序。主页是 MasterDetailPage。我已经读过要从母版页 VM 更改详细信息页,我只需要从 MasterPageViewModel 调用 NavigationService.NavigateAsync("NewDetailPage")。

当我这样做时,母版页会发生变化,并变成 NewDetailPage。我想保留 MasterDatilPage 并更改它的详细信息页面。

这是我的 App 类

public partial class App : PrismApplication
{
    public App(IPlatformInitializer initializer = null) : base(initializer) { }

    protected override void OnInitialized()
    {
        InitializeComponent();

        NavigationService.NavigateAsync("MenuPrincipalPage/ClubHousePage");
    }

    protected override void RegisterTypes()
    {
        Container.RegisterTypeForNavigation<MenuPrincipalPage>();
        Container.RegisterTypeForNavigation<ClubHousePage>();
        Container.RegisterTypeForNavigation<AProposPage>();
    }
}

这很好用。应用程序使用正确的主 (MenuPrincipalPage) 和正确的详细信息 (ClubHousePage) 启动。

我的 MenuPrincipalPageViewModel(母版页 VM),我尝试了一些东西。首先直接导航到详情页:

    public DelegateCommand AProposCommand { get;  private set; }

    private void APropos()
    {
        NavigationService.NavigateAsync("AProposPage", );
    }

母版页已更改。

然后我尝试了这个:

    public DelegateCommand AProposCommand { get;  private set; }

    private void APropos()
    {
        NavigationService.NavigateAsync("MenuPrincipalPage/AProposPage");
    }

MasterPage 也发生了变化。

此代码有效:

    public DelegateCommand AProposCommand { get;  private set; }

    private void APropos()
    {
        NavigationService.NavigateAsync("/MenuPrincipalPage/AProposPage");
    }

但是这里没有问题吗?我认为完整的导航堆栈已被删除。

我是不是做错了什么?

非常感谢您的建议, 朱利安

【问题讨论】:

    标签: navigation xamarin.forms prism master-detail


    【解决方案1】:

    它的工作方式与应有的完全一样。是什么让您认为您正在更改 MasterDetailPage?是因为你没有汉堡菜单吗?我猜是这样,因为你现在如何设置它会导致 MasterDetailPage 没有汉堡菜单,并且看起来没有 MasterDetailPage。您可以通过导航轻松地对此进行测试,然后从左边缘滑动以显示主菜单。

    使用 MasterDetailPage 时,您应该将详细信息包装在 NavigationPage 中。

    NavigationService.Navigate("MasterDetailPage/NavigationPage/Detail");

    然后在详细信息页面中完成的任何导航都将自动为其导航堆栈提供一个后退按钮。

    【讨论】:

    • 嗨,Brian,我添加了一个 NavigationPage,但我的问题仍然存在。事实上,我的问题是:为什么我必须在导航 URL 的开头放一个 / ?以下代码有效: NavigationService.NavigateAsync("/MenuPrincipalPage/ContenuPage/AProposPage");虽然这个没有: NavigationService.NavigateAsync("MenuPrincipalPage/ContenuPage/AProposPage");唯一的区别是开头的 /。
    • 当您在开头放置“/”时,您正在重置导航堆栈。听起来你做错了什么。如果您从 Master 简单地导航,请使用“NavigationPage/Target”,并且不要在路径中包含 master 详细信息页面。查看此示例:github.com/PrismLibrary/Prism-Samples-Forms/tree/master/…
    • 嗨,Brian,使用 NavigationPage/Target 将不会在 ViewA\ViewB\ViewC 中显示后退按钮。只有顶部的汉堡菜单
    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    相关资源
    最近更新 更多