Windows Phone 页面导航

本文关键字:导航 Phone Windows | 更新日期: 2024-11-07 13:11:44

我正在开发Windows Phone应用程序,这是我遇到问题的场景:

所以我有三页,我们称之为第1,2,3页。

在第 1 页,我有一个名为 start downloading 的按钮。单击按钮并使用NavigateService.Navigate(page2Uri)并导航到第 2 页。

第 2 页进行

查询并从互联网下载图像,因此在其OnNavigateTo处理程序中,我检查页面后退堆栈,如果从第 1 页导航,我将进行下载。在此页面的应用栏中,我有一个可以导航到第 3 页的按钮。

3 页是选项列表,这些选项将对第 2 页中下载的图像执行某些行为。选择一个选项后,我想返回第 2 页并对加载的图像执行一些行为。
问题来了:
如果我使用 NavigateService.Navigate(page2Uri) 从 page3 导航到 page2,它将再次调用 Page2 构造函数和OnNavigateTo处理程序,这将导致它丢失它已经获得的每个实例变量。
但是如果我使用NavigatService.GoBack它将返回到第 2 页,然后意识到后退堆栈顶部条目是第 1 页(因为第 1 页 -> 页 2 -> 页 3)。因此,它将再次重新下载所有内容。

我不希望在从第 3 页导航回第 2 页时再次下载任何内容。所以想知道是否有人对此有好主意。

谢谢。

Windows Phone 页面导航

您可以使用查询参数和 NavigationEventArgs 来提供帮助。

首先,您可以使用 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 的建议使用查询参数。
  • 您可以使用存储在应用程序等位置的全局数据.cs
  • 可以使用静态类来保存数据。
  • 您可以使用共享视图模型来保存参数。(或视图模型中的静态属性)

这完全取决于具体情况。我认为 Shawns 建议使用查询参数可能是最"正确"的 MVVM 方式,但其他方法也有它们的位置。

您需要实现以下函数和导航服务。这些代码肯定会解决您的问题

对于两个或多个参数,请使用此代码

String download="true";
String file="image";
NavigationService.Navigate(new Uri("/Page3.xaml?download="+download+"&file="+file+"", UriKind.Relative));

在导航到,将以下代码添加到您的 Page2

 protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            String download=NavigationContext.QueryString["download"];  
          String file=NavigationContext.QueryString["file"]; 
        }

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