Windows Phone页面导航

4
我正在开发一个Windows Phone应用程序,以下是我遇到的问题:
我有三个页面,我们称其为页面1、2、3。
在页面1中,我有一个名为“开始下载”的按钮。单击该按钮并使用NavigateService.Navigate(page2Uri)导航到页面2。
页面2从互联网上查询并下载图像,因此在它的OnNavigateTo处理程序中,我检查页面返回堆栈,如果它是从页面1导航而来,我将进行下载。在这个页面的应用程序栏中,我有一个按钮可以导航到页面3。
页面3是一系列选项的列表,这些选项将对在页面2中下载的图像执行某些行为。一旦我选择了一个选项,我想回到页面2并对已加载的图像执行某些操作。 现在出现了一个问题: 如果我使用NavigateService.Navigate(page2Uri)从页面3导航到页面2,它将调用Page2构造函数和OnNavigateTo处理程序,这将导致它失去已经拥有的每个实例变量。 但是,如果我使用NavigatService.GoBack,它将返回到页面2,然后意识到返回堆栈顶部条目是页面1(因为页面1->页面2->页面3)。因此,它将重新下载所有内容。
当从页面3返回到页面2时,我不希望再次下载任何内容。所以想知道是否有人有好的想法解决这个问题。
谢谢。
3个回答

5
您可以使用查询参数和NavigationEventArgs来帮助处理。
首先,您可以通过检查NavigationMode来使用NavigationEventArgs确定用户是前进还是后退。
其次,您可以使用查询参数告诉页面2进行下载。
从页面1开始:
private void MoveToPage2FromPage1()
{
    NavigationService.Navigate(new Uri("/Page2.xaml?shouldDownload=true", UriKind.Relative));
}

和页面2:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Back) return;

    string shouldDownload = ""; //May not be needed if you'll only ever go to page 2 from page 1 to download...
    if (NavigationContext.QueryString.TryGetValue("shouldDownload", out shouldDownload))
    {
        Convert.ToBoolean(shouldDownload);
    }
}

谢谢Shawn,我喜欢你的回答,这应该是处理这种问题的标准和正确方式。但是我使用了Jon的想法来保持页面的全局状态,它也可以完美地解决问题。对于你简洁的回答点赞。 - Allan Jiang
3
注意静态/全局属性。当应用程序被墓碑化时,它们将不会持久存在。请确保定期保存全局数据(或至少在应用程序事件中保存)。 - Shawn Kendrot

2

有几种方法可以将数据传递到另一个页面:

  • 您可以像Shawn建议的那样使用查询参数。
  • 您可以使用存储在app.cs等位置的全局数据。
  • 您可以使用静态类来保存数据。
  • 您可以使用共享viewModel来保存参数(或视图模型中的静态属性)。

所有这些都取决于特定情况。我认为使用查询参数的Shawn建议可能是最“正确”的MVVM方式,但其他方法也有其用处。


0
你需要实现以下函数和导航服务。 这些代码一定会解决你的问题。
对于两个或更多参数,请使用以下代码。
String download="true";
String file="image";
NavigationService.Navigate(new Uri("/Page3.xaml?download="+download+"&file="+file+"", UriKind.Relative));

在 OnNavigatedTo 事件中,将以下代码添加到您的 Page2 页面上。
 protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            String download=NavigationContext.QueryString["download"];  
          String file=NavigationContext.QueryString["file"]; 

        }

对于上述 OnNavigatedTo 函数,输出 true 和 image。您可以使用 MessageBox.Show(); 输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接