【问题标题】:Windows Phone Page NavigationWindows Phone 页面导航
【发布时间】:2012-08-07 18:37:07
【问题描述】:

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

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

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

第 2 页进行查询并从 Internet 下载图像,因此在其 OnNavigateTo 处理程序中,我检查页面返回堆栈,如果它是从第 1 页导航的,我将进行下载。在这个页面的应用栏中,我有一个可以导航到page3的按钮。

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

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

谢谢。

【问题讨论】:

    标签: c# .net silverlight windows-phone-7


    【解决方案1】:

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

    首先,您可以使用 NavigationEventArgs 通过检查 NavigationMode 来确定用户是前进还是后退。

    其次,可以通过查询参数告诉第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 的想法,保持页面的全局状态,也可以完美的解决问题。为您的简短回答 +1。
    • 注意静态/全局属性。当应用程序墓碑时,它们不会持续存在。确保定期保存全局数据(或至少在应用程序事件中保存)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      您需要实现以下功能和导航服务。 这些代码一定能解决你的问题

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

      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();输出

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多