如何使用Prism保存导航堆栈从Xamarin表单中的MasterDetailPage导航到ContentPage?

时间:2020-06-29 20:42:15

标签: xamarin xamarin.forms navigation prism master-detail

我正在开发Xamarin + Prism应用,现在遇到了问题。该应用程序使用MasterDetailPage作为布局。详细信息页面包含带有少量标记的google地图。点击标记时,会出现一个弹出窗口,如果点击该弹出窗口,则应打开一个单独的视图(我们将其称为Page1)。

我希望该视图不成为MasterDetailsPage的一部分,同时希望在顶部导航面板上具有“返回”按钮。此“后退”按钮应返回到MasterDetailsPage。问题来了。我还没有找到一种方法来做到这一点。如果您不使用Prism,则直接将其推入NavigationStack即可非常简单地完成。但是Prism不允许您这样做,您只有带有NavigateAsync的NavigationService。有没有办法实现这种行为?还是任何骇客?

MasterDetails页面代码

<?xml version="1.0" encoding="utf-8" ?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="Find.Views.MainPage"
             xmlns:pages="clr-namespace:Find.Views">
    <MasterDetailPage.Master>
        <pages:MenuPage />
    </MasterDetailPage.Master>
</MasterDetailPage>

我尝试了几种导航方式,例如:

await NavigationService.NavigateAsync($"Page1");
await NavigationService.NavigateAsync($"/Page1");
await NavigationService.NavigateAsync($"NavigationPage/Page1");

和其他,但是什么都没有。

我找到了类似的问题,但那里的答案不正确。 https://ios.developreference.com/article/13334449/How+do+you+navigate+Xamarin+Forms+using+Prism+from+Master+Detail+to+Content+Page+without+Master+Detail

谢谢。

1 个答案:

答案 0 :(得分:0)

是否要获得如下GIF所示的结果?(注意:单击“按钮”后,我将浏览第1页)

enter image description here

首先,我使用RegisterTypes方法注册页面,如以下代码所示。

 protected override void RegisterTypes(IContainerRegistry containerRegistry) {

            containerRegistry.RegisterForNavigation<MenuPage>();
            containerRegistry.RegisterForNavigation<NavigationPage>();

            containerRegistry.RegisterForNavigation<ViewA>();
            containerRegistry.RegisterForNavigation<Page1>();
            containerRegistry.RegisterForNavigation<ViewB>();
        }

如果要使用后退箭头,则需要将导航页面保持在根导航堆栈中。

例如。我默认显示ViewA,如下所示的导航代码

 await _navigationService.NavigateAsync(nameof(NavigationPage) + "/" + "ViewA");

然后,当我们想从ViewA导航到Page1时,我们应该使用以下代码来显示后退箭头。

 await _navigationService.NavigateAsync(nameof(NavigationPage) + "/" + "ViewA" + "/" + "Page1");

我上传了我的演示,您可以参考它。

https://github.com/851265601/XFromsPrismNavi