用棱镜掌握细节,如何?



我正在尝试使用MasterDetail进行测试和示例。您可以在以下位置查看代码:

https://github.com/jrariasf/MD8/tree/master/MD8

母版有 5 个按钮,可访问 4 个详细信息页面(主页、主页、视图 A、视图 B 和视图(。

从视图A,有2个按钮,我能够加载视图B和视图C

但我无法做到这一点,按下汉堡菜单中的按钮然后加载详细信息页面。

只有当我在"PrismMasterDetailPage.xaml"中的命令参数中放置一个绝对路径时,它才有效:

<?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:prism="http://prismlibrary.com"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="MD8.Views.PrismMasterDetailPage">
<MasterDetailPage.Master>
<ContentPage Title="Menu">
<StackLayout Padding="20">
<!-- TODO: // Update the Layout and add some real menu items  -->
<Button Text="Home" Command="{Binding NavigateCommand}" CommandParameter="/PrismMasterDetailPage/NavigationPage/ViewA" />
<Button Text="MainPage" Command="{Binding NavigateCommand}" CommandParameter="/NavigationPage/MainPage" />
<Button Text="ViewA" Command="{Binding NavigateCommand}" CommandParameter="../ViewA" />
<Button Text="ViewB" Command="{Binding NavigateCommand}" CommandParameter="./ViewB" />
<Button Text="ViewC" Command="{Binding NavigateCommand}" CommandParameter="ViewC" />
</StackLayout>
</ContentPage>
</MasterDetailPage.Master>
</MasterDetailPage>

然后,在"PrismMasterDetailPageViewModel.cs">

void ExecuteCommandName(string page)
{
Console.WriteLine("PrismMasterDetailPageViewModel - ExecuteCommandName() Vamos a {0}", page);
_navigationService.NavigateAsync(page);
}

如果我在"/PrismMasterDetailPage/NavigationPage/ViewA"中,我必须做什么来卸载ViewA并加载ViewB?

例如,在 App.xaml 中.cs代码为:

await NavigationService.NavigateAsync("PrismMasterDetailPage/NavigationPage/ViewA");

然后,在android模拟器上执行该应用程序,汉堡菜单的按钮,结果与我预期不符。 按主页按钮,_navigationService.GetNavigationUriPath(( 返回:/PrismMasterDetailPage/NavigationPage/ViewA/NavigationPage?useModalNavigation=true/ViewA

为什么?

如果我按下按钮 ViewA 或 ViewB 或 ViewC,它不会显示任何内容。但是在每个 View*ViewModel 上调用 OnNavigatedFrom(( 方法.cs

怎么了?

谢谢!!

您需要做的第一件事是了解您从哪里导航。Xamarin.Forms 中的导航非常依赖于从何处进行导航。请记住,如果没有棱镜,您将执行以下操作:

var mdp = new MyMasterDetailPage
{
Detail = new NavigationPage(new ViewA)
};

为了实现带有棱镜的汉堡菜单,您通常需要一个MasterDetailPage作为应用程序的主页。导航 Uri 中的下一段必须是导航页,下一页通常是内容页。

<Button Text="Home" 
Command="{Binding NavigateCommand}" 
CommandParameter="/PrismMasterDetailPage/NavigationPage/ViewA" />

好的,所以看看第一个,这通常是您在从PrismApplication导航时会使用的,这就是它工作的原因。

<Button Text="MainPage" 
Command="{Binding NavigateCommand}" 
CommandParameter="/NavigationPage/MainPage" />

看看这个,这真的很接近你想要的,除了你正在做一个绝对的导航,这意味着你正在重置Application.MainPage。您实际需要的是一个相对 Uri,因为您是从 MasterDetailPage 导航的。

<Button Text="ViewA" 
Command="{Binding NavigateCommand}" 
CommandParameter="../ViewA" />

这是完全错误的,因为../{path}仅在导航页面中受支持,而您位于MasterDetailPage中...

<Button Text="ViewB" 
Command="{Binding NavigateCommand}" 
CommandParameter="./ViewB" />

这根本不被棱镜支持。

<Button Text="ViewC" 
Command="{Binding NavigateCommand}" 
CommandParameter="ViewC" />

这是设置MasterDetailPage.Detail,如下所示:

mdp.Detail = new ViewC()

当然,正如我上面提到的,你需要它是

mdp.Detail = new NavigationPage(new ViewC());

非常感谢丹·西格尔!(@Dan S.(

一个月前,我刚刚看到您的评论,对不起。

我是 C# 和 Xamarin 和 Prism 的新手,我仍然是新手,但更少:-(

在过去的几周里,我学到了很多东西并测试了很多东西,我更好地理解了这些概念。

读完你之后我知道../{path} 仅对导航页有效。

此外,我遇到的一个问题是我在OnNavigatedTo方法中检查"_navigationService.GetNavigationUriPath(("的值,正如我后来读到的,当时UriPath不是真正的最终UriPath。

在我的代码中,我写道:

public void OnNavigatedTo(INavigationParameters parameters)
{
Console.WriteLine("DEBUG - ViewAVM: We are in {0}",
_navigationService.GetNavigationUriPath());
}

我将 GetNavigationUriPath(( 调用移动到另一个方法,结果与我预期的那样。

谢谢!!

最新更新