c# - 如何将数据传递到 ShellSection 的 ShellContent 以在 Xamarin.Forms Shell 应用程序上将同一页面用于不同目的?
问题描述
我正在构建一个Xamarin.Forms Shell应用程序,它提供了一个弹出窗口并且没有底部选项卡。用户界面是这样的:
左侧的第一个模型显示了打开的浮出控件及其项目。如您所见,Item1有其个人页面。同时,Item2、Item3和Item4被分组为顶部选项卡和弹出项(我使用元素FlyoutDisplayOptions.AsMultipleItems
上的值得到了这个结果)。ShellSection
我想让具有Ipsum、Dolor和Sit标题的页面共享同一个页面,一种根据所选顶部选项卡(或所选弹出项)更新的“单例”。这让我可以使用单个页面而不是创建不同的页面来托管各种内容。在 Xamarin.Forms Shell 应用程序上,我们可以在导航到页面时传递数据,在目标页面的视图模型上使用适当的属性。但是,我不知道如何将它与ShellSection
元素一起使用。在我看来,我计划在导航到其他选项卡时清除共享页面的内容。举个例子,假设我在Item2选项卡中,然后单击Item3选项卡(在相关弹出项中)。我打算:
- 清除共享页面的内容。
- 导航到新的顶部选项卡(即使我单击了弹出项)。
- 使用新内容更新共享页面。
我尝试使用路由将数据传递到共享页面;但是,这样做会覆盖应用程序的默认行为(它导航到全屏页面而不是选项卡式页面),因此我无法转到特定选项卡。也许路线是要走的路,但我不知道如何操纵它们来导航共享页面传递数据。到目前为止,我在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";
导致导航系统明显绕过带有顶部标签的页面。相反,它会创建一个全屏页面。我希望保留顶部选项卡。总而言之,我需要在导航到顶部选项卡页面时定义一个参数(这是一种“单一”页面,其内容被重置以托管相对于所选选项卡的新内容)。你知道这样做的方法吗?
解决方案
推荐阅读
- oracle - 在 Oracle JDBC 连接上获取 MySQL 错误堆栈跟踪
- python - 在 PySpark 中选择 json 数组元素
- java - 在 @Application bean 中使用构造函数注入会导致循环引用
- javascript - 如何选择一个将数组作为其构造函数的一部分的对象?
- nginx - 如何使用 Ingress Controller 在 Kubernetes 中路由请求和平衡负载?
- android - 失败的模拟器依赖
- shake-build-system - 在 Shake 中,Rules 的定义顺序重要吗?
- vue.js - Vue i18n,如何获取 dateTimeLocalization 的语言环境?
- c++ - 如何在成员函数内将函数及其参数传递给 std::async
- android - 如何保存片段数据以显示给下次登录