我有以下代码:
Task task = Navigation.PushAsync(myPage);
foreach(var temp in myModel)
{
//do bla bla
}
在我调用的页面上,当我完成执行我需要的内容时,我这样做:
this.Navigation.PopAsync();
问题是我只想在我的task
完成执行或myPage
完成执行后执行我的for
循环。
我该如何解决这个问题?
假设您使用的是异步方法,则可以将实现更改为
await Navigation.PushAsync(myPage)
然后继续您的 for 循环。
如果您不在异步方法中,则可以调用该方法并通过调用 GetAwaiter(( 强制阻止等待。获取结果((;
Navigation.PushAsync(myPage).GetAwaiter().GetResult();
从页面的 OnDisapearing 方法调用事件来执行此操作,然后您创建的导航服务可以订阅此事件,然后您可以使用 "TaskCompletionSource"
wati,直到页面完成其工作,然后完成任务。有关完成此操作的更多详细信息,您可以查看此博客文章。
以下是应使用的导航服务的概述:
public async Task<T> NavigateToModal<T>(string modalName)
{
var source = new TaskCompletionSource<T>();
if (modalName == nameof(NewItemPage))
{
var page = new NewItemPage();
page.PageDisapearing += (result) =>
{
var res = (T)Convert.ChangeType(result, typeof(T));
source.SetResult(res);
};
await App.Current.MainPage.Navigation.PushModalAsync(new NavigationPage(page));
}
return await source.Task;
}
猜对了,您希望在执行this.Navigation.PopAsync()
后执行foreach循环。右?
我建议采取以下方法之一:
1(在(推送(myPage
上执行任务,当它得到它时PopAsync()
:你可以交出任何数据(例如 myModel
( 您需要在对象中myPage
并执行循环
protected override void OnDisappearing()
{
base.OnDisappearing();
foreach(var temp in myModel)
{
//do bla bla
}
}
2(您在原始页面上设置了一个标志,表明它已被pushAsync(myPage)
隐藏,并在重新出现后执行您的代码。
bool pushStarted;
protected void YourMethod()
{
pushStarted = true;
await Navigation.PushAsync(myPage);
}
protected override void OnAppearing()
{
base.OnAppearing();
if(pushStarted)
{
pushStarted = false;
foreach(var temp in myModel)
{
//do bla bla
}
}
}