Windows Phone 页面导航
本文关键字:导航 Phone Windows | 更新日期: 2024-11-07 13:11:44
我正在开发Windows Phone应用程序,这是我遇到问题的场景:
所以我有三页,我们称之为第1,2,3页。
在第 1 页,我有一个名为 start downloading
的按钮。单击按钮并使用NavigateService.Navigate(page2Uri)
并导航到第 2 页。
查询并从互联网下载图像,因此在其OnNavigateTo
处理程序中,我检查页面后退堆栈,如果从第 1 页导航,我将进行下载。在此页面的应用栏中,我有一个可以导航到第 3 页的按钮。
3 页是选项列表,这些选项将对第 2 页中下载的图像执行某些行为。选择一个选项后,我想返回第 2 页并对加载的图像执行一些行为。
问题来了:
如果我使用 NavigateService.Navigate(page2Uri)
从 page3 导航到 page2,它将再次调用 Page2 构造函数和OnNavigateTo
处理程序,这将导致它丢失它已经获得的每个实例变量。
但是如果我使用NavigatService.GoBack
它将返回到第 2 页,然后意识到后退堆栈顶部条目是第 1 页(因为第 1 页 -> 页 2 -> 页 3)。因此,它将再次重新下载所有内容。
我不希望在从第 3 页导航回第 2 页时再次下载任何内容。所以想知道是否有人对此有好主意。
谢谢。
您可以使用查询参数和 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();
输出