-2

现在我正在开发一个 Windows 手机应用程序,是的,这是我的第一个 Windows 应用程序。现在我面临一个问题,不知道我犯了什么愚蠢的错误。是的,当然我已经调试过了。

现在,我到底在做什么?

  1. 将数据从第一页传递到第二页,
  2. 在页面上,在 onNavigateTo() 方法中捕获数据,是的,我正确接收它。
  3. 根据我得到的参数/数据(即 ID),我正在进行 Web 服务调用。

问题:如果我从第 2 页移到第 3 页并再次回到第 2 页,则它再次进行网络呼叫。DownloadStringAsync即在下面的代码中再次调用。

即,如果第 2 页的 ListBox 有 5 个数据,现在单击特定项目,我将移至第 3 页,如果我从第 3 页回到第 2 页,项目将翻倍,即 10 个项目(只是因为它再次拨打电话)

这是参考的可能代码:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
       base.OnNavigatedTo(e);

       type = Convert.ToInt32(NavigationContext.QueryString["Type"]);
       if (type != 0)
       {
           if (NetworkInterface.GetIsNetworkAvailable())
           {
              client.DownloadStringAsync(new Uri(Utils.Constant.WebService_URL));
            }
            else
            {
                    MessageBox.Show("Please check internet connection!!");
            }
        }
}
4

3 回答 3

5

你不能使用下面的代码来测试用户是否使用了返回按钮吗?

e.NavigationMode == System.Windows.Navigation.NavigationMode.Back
于 2013-01-04T10:50:04.340 回答
0

有时这种方法(QueryString)会产生问题。

在后面的事件中,它会产生问题,最好将 id(参数)存储在隔离存储应用程序密钥中

IsolatedStorageSettings.ApplicationSettings["id"] = "你的数据";

于 2013-01-04T10:16:56.067 回答
0

OnNavigatedTo每当您通过向前导航或向后导航导航到页面时都会调用。这就是当您从第 3 页导航回第 2 页时它会被重新触发的原因。

您可以通过仅在前向导航上触发网络调用来避免这种情况。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
   base.OnNavigatedTo(e);

   if (this.isInitialized) return;

   type = Convert.ToInt32(NavigationContext.QueryString["Type"]);
   if (type != 0)
   {
       if (NetworkInterface.GetIsNetworkAvailable())
       {
          client.DownloadStringAsync(new Uri(Utils.Constant.WebService_URL));
        }
        else
        {
                MessageBox.Show("Please check internet connection!!");
        }
    }
    this.isInitialized = true;
}

请注意,NetworkInterface.GetIsNetworkAvailable在某些情况下可能会长时间阻塞(在这种情况下是 UI 线程),要解决此问题,您可以使用网络检测事件

于 2013-01-04T10:32:14.507 回答