Windows平台Tabbed Page模态页调用Dialog弹窗后导航功能失效问题排查求助
Windows平台Tabbed Page模态页调用Dialog弹窗后导航功能失效问题排查求助
大家好,我现在遇到一个MAUI在Windows平台上的导航异常问题,Android端完全正常,麻烦帮忙看看哪里出问题了。
问题场景梳理
- 从主页面以模态方式打开带Tab的页面:
await Navigation.PushModalAsync(new OrderTabsPage(_userService, _services)); OrderTabsPage作为TabbedPage,初始化时会给所有实现IOrderTab的子Tab调用Initialize方法- 其中一个Tab是
OrderMainTab(ContentView实现IOrderTab),它会绑定OrderMainViewModel并拿到导航实例_navigation - 从
OrderMainViewModel里再打开另一个模态页ChangeOrderPage,选择内容后关闭,通过WeakReferenceMessenger通知原页面 - 原页面收到通知后,调用
PINConfirmationDialog弹窗验证PIN,但在Windows上弹窗关闭后,所有导航操作直接失效——不管是再打开新的模态页,还是关闭当前模态栈回到主页面,都完全没反应,Android上一切正常。
关键代码片段
1. OrderMainTab获取导航实例
public void Initialize(User user, IServiceProvider services, OrderViewModel viewModel) { BindingContext = new OrderMainViewModel(user, services, viewModel, this.Navigation); }
2. 打开ChangeOrderPage的命令
[RelayCommand] private async Task LookupOrder() { try { var changeOrderPage = new ChangeOrderPage(_db, _user, _orderViewModel.Order.Id); MainThread.BeginInvokeOnMainThread(async () => { await _navigation.PushModalAsync(changeOrderPage); }); } catch (Exception ex) { await Application.Current.MainPage.DisplayAlert("Error", ex.Message, "OK"); } }
3. PIN验证弹窗调用逻辑
private async Task<bool> VerificationCheck(Order newOrder) { if (newOrder == null) { await App.Current.MainPage.DisplayAlert("Error", "Data tidak ditemukan.", "OK"); return false; } if (newOrder.IsPrint) { // 我特意加了模态栈计数,弹窗前后都是1,看起来栈没问题 await App.Current.MainPage.DisplayAlert("Error", $"Modal stack count: {Application.Current.MainPage.Navigation.ModalStack.Count.ToString()}", "OK"); object result = null; await MainThread.InvokeOnMainThreadAsync(async () => { result = await App.Current.MainPage.ShowPopupAsync(new PINConfirmationDialog(newOrder.Code)); }); await App.Current.MainPage.DisplayAlert("Error", $"Modal stack count: {Application.Current.MainPage.Navigation.ModalStack.Count.ToString()}", "OK"); if (result is string pin) { if (string.IsNullOrWhiteSpace(pin)) { await App.Current.MainPage.DisplayAlert("Error", "PIN tidak valid.", "OK"); return false; } if (pin.Trim() != newOrder.Verification.Trim()) { await App.Current.MainPage.DisplayAlert("Error", "PIN Salah. Mohon masukkan PIN yang benar.", "OK"); return false; } return true; } return false; } return true; }
已做的排查
- 确认弹窗前后的模态栈数量都是1,没有异常堆积
- 尝试过用
MainThread.InvokeOnMainThreadAsync包裹弹窗调用,问题依旧 - 所有导航操作在弹窗前都正常,只有弹窗关闭后才失效
- Android平台完全没有这个问题,仅Windows端出现异常
有没有遇到过类似问题的朋友?或者能帮我分析下Windows平台上MAUI的Popup和模态导航之间会不会有什么冲突?比如弹窗关闭后有没有可能阻塞了导航的UI线程,或者导航实例的上下文发生了变化?
内容来源于stack exchange
相关产品推荐
相关产品推荐

