我正在尝试使用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(( 调用移动到另一个方法,结果与我预期的那样。
谢谢!!