首页 > 解决方案 > 如何将数据传递到 ShellSection 的 ShellContent 以在 Xamarin.Forms Shell 应用程序上将同一页面用于不同目的?

问题描述

我正在构建一个Xamarin.Forms Shell应用程序,它提供了一个弹出窗口并且没有底部选项卡。用户界面是这样的:

在此处输入图像描述

左侧的第一个模型显示了打开的浮出控件及其项目。如您所见,Item1有其个人页面。同时,Item2Item3Item4被分组为顶部选项卡和弹出项(我使用元素FlyoutDisplayOptions.AsMultipleItems上的值得到了这个结果)。ShellSection我想让具有IpsumDolorSit标题的页面共享同一个页面,一种根据所选顶部选项卡(或所选弹出项)更新的“单例”。这让我可以使用单个页面而不是创建不同的页面来托管各种内容。在 Xamarin.Forms Shell 应用程序上,我们可以在导航到页面时传递数据,在目标页面的视图模型上使用适当的属性。但是,我不知道如何将它与ShellSection元素一起使用。在我看来,我计划在导航到其他选项卡时清除共享页面的内容。举个例子,假设我在Item2选项卡中,然后单击Item3选项卡(在相关弹出项中)。我打算:

  1. 清除共享页面的内容。
  2. 导航到新的顶部选项卡(即使我单击了弹出项)。
  3. 使用新内容更新共享页面。

我尝试使用路由将数据传递到共享页面;但是,这样做会覆盖应用程序的默认行为(它导航到全屏页面而不是选项卡式页面),因此我无法转到特定选项卡。也许路线是要走的路,但我不知道如何操纵它们来导航共享页面传递数据。到目前为止,我在AppShell.xaml.cs文件中写了这个:

var fi = new FlyoutItem    { FlyoutDisplayOptions = FlyoutDisplayOptions.AsMultipleItems };
var ss = new ShellSection  { FlyoutDisplayOptions = FlyoutDisplayOptions.AsMultipleItems };

foreach (var kind in kinds) {   // "kinds" is obtained from an external service
   var sc = new ShellContent { Title = kind.Name, ContentTemplate = new KindPage(kind.Id) };    
   ss.Items.Add(sc);
}

fi.Items.Add(ss);
ShellItems.Items.Add(fi);

在网上,我读到我可以将参数传递KindPage. 但是,这种方法不太适合这种情况,因为我需要在页面出现时而不是在构建时需要一些东西(即清理页面以准备托管新选项卡的内容) 。此外,这将导致创建不同的KindPage对象,每个选项卡一个。相反,我认为单页会更合适。简而言之,我需要像这样指定Route不同ShellContent元素的属性:由 Xamarin.Forms Shell 的内部行为定义的标准路由加上一个参数,让我区分要显示的内容。

到目前为止,使用以下内容覆盖该Route属性:

Route = "//KindPage?kind=1";

导致导航系统明显绕过带有顶部标签的页面。相反,它会创建一个全屏页面。我希望保留顶部选项卡。总而言之,我需要在导航到顶部选项卡页面时定义一个参数(这是一种“单一”页面,其内容被重置以托管相对于所选选项卡的新内容)。你知道这样做的方法吗?

标签: c#xamarinxamarin.formsxamarin.androidxamarin.ios

解决方案


推荐阅读