我有一个使用新AppShell的xamarin表单项目。我有一个带有一些菜单项的弹出菜单。菜单项之一称为例如MyComputer
。打开它会显示一个文件夹列表。当我单击一个文件夹时,将打开一个新页面,并再次显示一个文件夹列表(依此类推),例如嵌套文件夹。不幸的是,当使用新的await Shell.Current.GoToAsync("folder");
打开文件夹页面内的文件夹时,什么也没有发生。不执行导航。似乎不允许将同一页面推入导航堆栈。但是,这适用于“旧”导航myPage.Navigation.PushAsync(folderPage);
。因为AppShell
的原始文档没有嵌套视图的限制,所以我认为我缺少一些东西。
我的AppShell.xaml
<FlyoutItem FlyoutDisplayOptions="AsMultipleItems" Route="app">
<ShellContent Title="MyComputer" Route="myComputer" ContentTemplate="{DataTemplate views:MyComputerPage}"/>
</FlyoutItem>
注册我的文件夹页面:
Routing.RegisterRoute("folder", typeof(FolderPage));
从MyComputerPage
调用文件夹页面(有效):
await Shell.Current.GoToAsync("folder?name=myFolder1");
从FolderPage
调用文件夹页面(此操作无效,没有任何反应,未执行导航):
await Shell.Current.GoToAsync("folder?name=myFolder1b");
我想这样导航:
MyComputerPage -> FolderPage -> FolderPage -> FolderPage -> ...
只是为了更好地了解文件夹结构是什么样子:
编辑:
@Junior Jiang-MSFT,您可以使用:
答案 0 :(得分:1)
关于Relative Route和Passing Data,来自共享的gif和代码,也许在使用它们时会出错。
如果应用程序中的所有路由都是唯一的,则可以仅通过将唯一的路由名称指定为相对URI来执行导航:
await Shell.Current.GoToAsync("TargetPageName");
//such as await Shell.Current.GoToAsync("myFolder1Page");
在执行程序化导航时,数据可以作为查询参数传递。
await Shell.Current.GoToAsync($"TargetPageName?DefinedKeyName={BePassedValue}");
//such as Shell.Current.GoToAsync($"myFolder1Page?name={ValueOfmyFolder1Page}");
要接收数据,代表每个导航参数的类或该页面的BindingContext的类必须为每个查询参数用QueryPropertyAttribute
装饰:
[QueryProperty("Name", "name")]
public partial class myFolder1Page: ContentPage
{
public string Name
{
set
{
BindingContext = FolderData.FoldePages.FirstOrDefault(m => m.Name == Uri.UnescapeDataString(value));
}
}
...
}
所以这是您的问题,首先需要重命名页面名称以适合此路由方法。
例如:
在 MyComputerPage 中,当您导航到 myFolder1 页面时,可以在 myFolder1 页面上注册myFolder1页面的密钥。
然后如果没有数据:
await Shell.Current.GoToAsync("myFolder1");
传递数据:
await Shell.Current.GoToAsync($"myFolder1?name={ValueOfmyFolder1}");
当该工作页面和下一个页面相同注册时,然后进入 myFolder1 页面,接下来要导航到 myFolder1a 页面,应如下所示:
await Shell.Current.GoToAsync("myFolder1a");//no data
await Shell.Current.GoToAsync($"myFolder1a?name={ValueOfmyFolder1a}");// pass data
下一步,要导航至 myFolder1aX 页面,应编写如下:
await Shell.Current.GoToAsync("myFolder1aX");//no data
await Shell.Current.GoToAsync($"myFolder1aX?name={ValueOfmyFolder1aX}");//pass data