You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:39:34