【问题标题】:xamarin forms shell doesn't navigate to nested viewxamarin 表单外壳无法导航到嵌套视图
【发布时间】:2019-07-17 11:02:43
【问题描述】:

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

只是为了更好地理解文件夹结构的外观:

  • 我的文件夹 1
    • 我的文件夹1a
      • myFolder1aX
      • myFolder1aY
      • myFolder1aZ
    • myFolder1b
    • myFolder1c
  • 我的文件夹2
  • 我的文件夹3

编辑:

@Junior Jiang - MSFT 给你:

【问题讨论】:

  • 您的意思是使用//app/folderpage 导航?是的,我已经试过了。但无论如何我不想从根路由。导航堆栈应该保留。
  • 好吧,明白了。能否在运行时显示带有 FlyoutItem 的屏幕截图?
  • @Junior Jiang - MSFT 查看编辑
  • 感谢更新。然后在单击 MyComputer 时,您想要导航到哪个视图。

标签: forms shell xamarin view navigation


【解决方案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

【讨论】:

  • 这是我迄今为止从文档中了解到的。但现在想想一个包含数千个文件夹的菜单树。 (例如 Windows C:\ 或商店应用程序或任何其他递归菜单中的嵌套类别)。并且您想从一个文件夹导航到下一个嵌套文件夹。当然我不想为每个文件夹都创建一个 c# 类(page.cs)。
  • @Crunch 是的,不需要为每个文件夹创建 c# 类。这个虽然我没试过,是可行的,但是如果不想创建一个页面,那么就需要复用下一个页面来填充新的数据。这将使同一页面的数据处理复杂化。如果要实现文件目录浏览功能,不推荐使用界面导航方式。可以在列表视图中单击它。比较合理。
  • 我明白了,谢谢。因此,您确认了我的怀疑,即新的 shell 导航不可能做到这一点(尽管旧的 NavigationService 可能)。正如您已经说过的,我必须在不使用导航的情况下处理一页内的新数据。还是谢谢你!
  • @Crunch 对于简单的关卡导航应该仍然适用,这应该比普通导航更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多