有很多示例显示如何在Window 8(WinRT)中导航到页面时传递参数。但我找不到任何传递参数的提示。
情况:用户导航到相同数据的详细信息页面。数据通过
Frame.Navigate(typeof(DedtailsPage), data);
如何在GoBack()
上传回已更改的数据?
答案 0 :(得分:5)
在某处存储对数据的引用并在导航回来时检索它?
另请注意,最好不要在页面之间传递除简单字符串或值之外的对象,因为只有简单类型才能存储帧导航状态,以防应用程序被暂停。
答案 1 :(得分:2)
我知道,这是一个非常糟糕的主意,但通常我会用这个:
写:
框架rootFrame = Window.Current.Content as Frame;
rootFrame.Tag = myObject1;
阅读:
框架rootFrame = Window.Current.Content as Frame;
var myObject2 = rootFrame.Tag;
答案 2 :(得分:0)
我已经做了另一个选择来处理这件事。 请记住,我是一名Xamarin开发人员(不是Forms!),所以我一直在寻找一个类似于所有平台的解决方案:iOS,Android和Windows。
我非常喜欢事件,而不是传递对象或存储全局变量。 因此,将数据从PageB(孩子)传递给PageA(父母)的最佳选择是通过事件进行交流。
一些注意事项:在iOS和Android中,当您从“页面”导航到“页面”时,您可以通过传递要导航到的目标对象的实例来执行此操作。在iOS中,您可以创建自定义UIViewController的实例。在Android中,您可以创建自定义片段的实例。这样做允许您将事件处理程序附加到您的实例。
一个例子:
var controller = new ExtrasViewController();
controller.ExtraSelected += ExtrasFragment_ExtraSelected;
controller.ExtrasCleared += ExtrasFragment_ExtrasCleared;
this.NavigationController.PushViewController(controller, false);
在WinRT应用中,您只能传递目标网页的“类型”以导航到。因此,将事件处理程序附加到页面实例的唯一方法是使用调用页面中的OnNavigatedFrom方法。因此,假设您在PageA中并希望将一些事件处理程序附加到您的PageB,在它变为活动状态之前,只需在您的PageA“后面的代码”中写入:
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
var page = e.Content as ExtraBody;
if(page != null)
{
page.ExtraSelected += ExtrasFragment_ExtraSelected;
page.ExtrasCleared += ExtrasFragment_ExtrasCleared;
}
}