在转到主视图之前准备数据

时间:2014-01-18 22:21:59

标签: c# xaml asynchronous windows-phone-8 windows-phone

当用户触摸应用图标时, 我想在用户进入主视图之前执行这些步骤

  1. 从URI
  2. 获取json字符串
  3. 使用JArray.Parse获取值
  4. 完成后,转到主视图。
  5. 问题是如何阻止用户转到主视图 并把所有代码
    我试图将它放在App.xaml.cs文件中的Application_Launching方法

    // Code to execute when the application is launching (eg, from Start)
    // This code will not execute when the application is reactivated
    private void Application_Launching(object sender, LaunchingEventArgs e) 
    {
        // code here
    }
    

    但它并不会阻止程序在提取完成之前进入主视图 我发现实际上在MainPage.xaml中,如果我把这个代码放在这个

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        while(true) {} 
        // it will prevent the program to go to the main view, 
        // and will stick with the loading screen until this function reach its end
    }
    

    所以我想,我可以将所有代码放在这里,当我完成提取时,我将暂时解决,它会自动进入主视图。

    我试试,这是代码

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        bool isFetchFinished = false;
    
        ObservableCollection<PromoViewModel> Promos = new ObservableCollection<PromoViewModel>();
    
        WebClient client = new WebClient();
    
        client.DownloadStringCompleted += (s, evt) =>
        {
            if (evt.Error == null)
            {
                // Retrieve the JSON
                string jsonString = evt.Result;
    
                JArray promos = JArray.Parse(jsonString);
                foreach (JObject promo in promos)
                {
                    string name = promo["name"].Value<string>();
                    string description = promo["description"].Value<string>();
                    string img = promo["image"].Value<string>();
    
                    Promos.Add(new PromoViewModel() { Name = name, Description = description, Img = img });
                }
              isFetchFinished = true;
              System.Diagnostics.Debug.WriteLine("finish fetch");
           }
        };
    
        // run 
        client.DownloadStringAsync(new Uri("the json url")); 
    
        while(true) {
            if(isFetchFinished) {
                App.ViewModel.LoadData(Promos); // pass value to main view model
                break; // after complete, break
            }
        }
    }
    

    我认为它会起作用,但事实并非如此 这是我发现的,
    在OnNavigatedTo函数完成之前,WebClient DownloadStringAsync将不会运行 因为它仍然在等待while循环中断并达到结束函数 这个

    isFetchFinished = true; // will never executed
    

    产生无限循环。
    我想我把fetch代码放在了错误的方法中。放置所有这些的正确位置在哪里?

1 个答案:

答案 0 :(得分:3)

哎呀,你做错了。首先,您必须指定起始页面。如果要在导航之前下载某些数据,可以创建一个特殊的“下载”页面,该页面实际上是启动应用程序时导航到的第一页。然后,下载完成后,您将导航到主页面。这实际上是扩展闪屏的替代品。

此外,永远不要将while (true)放在任何UI代码中,这只会冻结应用程序。此外,如果申请被冻结,你永远不会有机会“解冻”它。