我是 Xamarin 表单的新手,不知道如何处理这种情况。我尝试以多种方式实现它,但没有成功。
我有一个页面,当用户进行操作时(在文本框中写入文本并使用回车键发送),我的应用程序必须进行一些检查。根据检查的结果,可能需要显示一个模式页面,其中包含要选择的项目列表。用户进行选择过程必须继续进行其他检查。这是我的问题,因为在接下来的检查中,我必须显示另一个页面。用户必须进行选择/输入某个日期,然后继续完成该过程,但不会出现此页面。我正在使用消息中心订阅模式页面。第一个模态页面出现并进行选择。第二个模态页面永远不会显示,然后进程永远不会完成。这是我的一些代码:
NavigationPage navigationPage = new NavigationPage(new ListItemsPage(products));
Navigation.PushModalAsync(navigationPage);
MessagingCenter.Subscribe<ListItemsPage, Guid?>(this, "Select product", (obj, item) =>
{
try
{
if (item != null)
{
product = products.SingleOrDefault(x => x.Guid == item);
if (product != null) ProcessLine(product);
}
}
catch(Exception ex)
{
throw ex;
}
finally
{
MessagingCenter.Unsubscribe<ListItemsPage, Guid?>(this, "Select product");
}
});
在 ListItemsPage 上,当项目被选中时,我有这个代码:
private void MenuItem_Clicked(object sender, EventArgs e)
{
// some logic...
Navigation.PopModalAsync();
MessagingCenter.Send(this, "Select product", SelectedGuid);
}
SelectedGuid 是一个 Guid 类型的数据,当 debbugin 被很好地选择时。使用 ProcessLine 方法时会出现问题。
private void ProcessLine(Product product) {
// make some logic...
NavigationPage navigationPage = new NavigationPage(new ControlUnitsPage(model));
Navigation.PushModalAsync(navigationPage);
MessagingCenter.Subscribe<ControlUnitsPage, ControlUnits>(this, "Select units, date and lot code", (obj, item) =>
{
try
{
if (item != null)
{
_date = item.Date;
_code = item.Code;
_units = item.Units;
Save(productLine, product, _units, _date,_code);
}
}
catch(Exception ex)
{
throw ex;
}
finally
{
MessagingCenter.Unsubscribe<ControlUnitsPage, ControlUnits>(this, "Select units, date and lot code");
}
});
}
ControlUnitsPage 与最后一页具有相同的结构。首先创建一个 PopModalAsync,然后发送发送 ControlUnits 类型实例的消息。
private void Button_Clicked(object sender, EventArgs e)
{
//some logic...
Item = new ControlUnits() { Date = DateField.Date, Code = CodeField.Text, Units = int.Parse(SelectedUnits.Value.ToString()) };
Navigation.PopModalAsync();
MessagingCenter.Send(this, "Select units, date and lot code", Item);
}
我认为问题出在调用方法的顺序上,但不知道正确的顺序是什么,因为我无法理解 pushmodal、popmodal 方法的工作原理,如果在那之后订阅,我是否应该使用 await 。我真的不知道,我需要帮助,请。
太感谢了!