3

有很多示例展示了如何在 Window 8 (WinRT) 中导航到页面时传递参数。但我找不到任何关于传递参数的提示。
情况:用户导航到相同数据的详细信息页面。数据通过以下方式传递到页面

Frame.Navigate(typeof(DedtailsPage), data);

如何将更改的数据传回GoBack()

4

3 回答 3

5

将数据的引用存储在某处并在您返回时检索它?

另请注意,最好不要在页面之间传递简单字符串或值以外的对象,因为仅支持简单类型来存储框架导航状态,以防您的应用程序被挂起。

于 2013-01-16T22:32:03.843 回答
2

我知道,这是一个非常糟糕的主意,但通常我使用这个:

  1. 来写:

    Frame rootFrame = Window.Current.Content as Frame;
    rootFrame.Tag = myObject1;

  2. 读书:

    Frame rootFrame = Window.Current.Content as Frame;
    var myObject2 = rootFrame.Tag;

于 2014-12-15T19:56:35.093 回答
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;
    }
}
于 2015-08-13T09:22:08.177 回答