xamarin Forms Shell无法导航到嵌套视图

时间:2019-07-09 15:30:53

标签: forms shell xamarin view navigation

我有一个使用新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 -> ...

只是为了更好地了解文件夹结构是什么样子:

  • myFolder1
    • myFolder1a
      • myFolder1aX
      • myFolder1aY
      • myFolder1aZ
    • myFolder1b
    • myFolder1c
  • myFolder2
  • myFolder3

编辑:

@Junior Jiang-MSFT,您可以使用:

enter image description here

1 个答案:

答案 0 :(得分:1)

关于Relative RoutePassing 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