有很多示例展示了如何在 Window 8 (WinRT) 中导航到页面时传递参数。但我找不到任何关于传递参数的提示。
情况:用户导航到相同数据的详细信息页面。数据通过以下方式传递到页面
Frame.Navigate(typeof(DedtailsPage), data);
如何将更改的数据传回GoBack()
?
有很多示例展示了如何在 Window 8 (WinRT) 中导航到页面时传递参数。但我找不到任何关于传递参数的提示。
情况:用户导航到相同数据的详细信息页面。数据通过以下方式传递到页面
Frame.Navigate(typeof(DedtailsPage), data);
如何将更改的数据传回GoBack()
?
将数据的引用存储在某处并在您返回时检索它?
另请注意,最好不要在页面之间传递简单字符串或值以外的对象,因为仅支持简单类型来存储框架导航状态,以防您的应用程序被挂起。
我知道,这是一个非常糟糕的主意,但通常我使用这个:
来写:
Frame rootFrame = Window.Current.Content as Frame;
rootFrame.Tag = myObject1;
读书:
Frame rootFrame = Window.Current.Content as Frame;
var myObject2 = rootFrame.Tag;
我已经做出了另一个选择来处理这个问题。请记住,我是 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;
}
}