Windows 8 app:如何在GoBack()上传递参数?

时间:2013-01-16 21:35:13

标签: windows-8 navigation windows-runtime

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

传递给页面
Frame.Navigate(typeof(DedtailsPage), data);

如何在GoBack()上传回已更改的数据?

3 个答案:

答案 0 :(得分:5)

在某处存储对数据的引用并在导航回来时检索它?

另请注意,最好不要在页面之间传递除简单字符串或值之外的对象,因为只有简单类型才能存储帧导航状态,以防应用程序被暂停。

答案 1 :(得分:2)

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

  1. 写:

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

  2. 阅读:

    框架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;
    }
}