2014-01-18 3 views
1

Когда пользователь нажмите на значок приложения, Я хочу, чтобы сделать эти шаги, прежде чем пользователь перейти на главный экранПодготовка данных, прежде чем перейти к главному экрану

  1. Fetch JSon строку из URI
  2. Использование JArray.Parse для получения значения
  3. В конце концов, перейдите на основной экран.

Проблема заключается в том, как я могу предотвратить пользователю перейти к главному экрану и поместить весь код
Я пытался поставить его в методе Application_Launching в App.xaml.cs файл

// 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 
     } 
    } 
} 

Я думал, что это будет работать, но это не было.
Это то, что я нашел,
WebClient DownloadStringAsync не запускается до завершения функции OnNavigatedTo.
Потому что он все еще ждет, пока цикл while разобьется и достигнет конечной функции.
И это

isFetchFinished = true; // will never executed 

Результирующая бесконечный цикл.
Я думаю, что я поместил код извлечения в неправильный метод. Где подходящее место, чтобы положить все это?

ответ

3

Ой, вы делаете все это неправильно. Прежде всего, вы должны указать начальную страницу. Если вы хотите загрузить некоторые данные перед тем, как перейти на него, вы можете создать специальную страницу «загрузка», которая на самом деле является первой страницей, на которой была запущена при запуске приложения. И затем, как только загрузка будет завершена, вы перейдете на главную страницу. Это фактически замена расширенного экрана заставки.

Кроме того, никогда не ставьте while (true) в любой код пользовательского интерфейса, который просто заморозит приложение. Кроме того, если приложение заморожено, у вас никогда не будет возможности «разморозить» его.

+0

спасибо, брат, я пришел из мира iOS, так что это способ iOS для этого. Я не знаю, в Windows Phone, чтобы загрузить данные, мы должны создать новое представление. Можете ли вы показать мне небольшой синтаксис? –

+0

Я не говорил, что вам нужно * создать новое представление, я сказал, что вы * можете * создать другую стартовую страницу - ту, которая отобразит некоторый текст «загрузка ...», пока данные не закончат загрузку, а затем автоматически пользователя на фактическую стартовую страницу. –

Смежные вопросы