当用户触摸应用图标时, 我想在用户进入主视图之前执行这些步骤
问题是如何阻止用户转到主视图
并把所有代码
我试图将它放在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代码放在了错误的方法中。放置所有这些的正确位置在哪里?
答案 0 :(得分:3)
此外,永远不要将while (true)
放在任何UI代码中,这只会冻结应用程序。此外,如果申请被冻结,你永远不会有机会“解冻”它。