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

WinUI3中XAML Frame无法条件取消导航请求的问题求助

解决WinUI3异步导航事件中e.Cancel不生效的问题

问题根源

Navigating事件是同步执行的,使用async void处理时,代码执行到await会立即返回,导航流程会继续推进,等异步操作完成后再设置e.Cancel已经无法中断已启动的导航流程。

解决方案

核心思路:先立即取消当前导航,保存用户原本的导航目标信息,在用户确认后再手动触发导航(若用户选择离开)。

步骤1:修改导航事件处理逻辑

private async void NavigationRequest(object sender, NavigatingCancelEventArgs e)
{
    // 跳过已提交或无更改的情况
    if (Model.IsCommitted)
        return;

    var updated = Model.GetUpdatedFields(GetFieldList());
    if (updated.Count == 0)
        return;

    // 1. 立即取消当前导航,避免异步等待期间导航流程继续
    e.Cancel = true;

    // 2. 保存原本的导航参数,用于后续手动导航
    var targetPageType = e.SourcePageType;
    var navigationMode = e.NavigationMode;
    var parameter = e.Parameter;

    // 3. 弹出未保存更改确认对话框
    bool stay = await PopUpDialog.UnsavedChanges(XamlRoot, updated);

    // 4. 如果用户选择离开,手动触发导航并临时跳过检查
    if (!stay)
    {
        try
        {
            // 临时取消事件订阅,避免手动导航时再次触发确认逻辑
            MainWindow.Window_MainFrame.Navigating -= NavigationRequest;
            
            // 根据原导航模式执行对应操作
            switch (navigationMode)
            {
                case NavigationMode.New:
                    await MainWindow.Window_MainFrame.NavigateAsync(targetPageType, parameter);
                    break;
                case NavigationMode.Back:
                    if (MainWindow.Window_MainFrame.CanGoBack)
                        MainWindow.Window_MainFrame.GoBack();
                    break;
                // 按需补充Forward等其他导航模式的处理
            }
        }
        finally
        {
            // 恢复事件订阅,保证后续导航仍能触发检查
            MainWindow.Window_MainFrame.Navigating += NavigationRequest;
        }
    }
}

步骤2:修正变量名错误

原代码中bool stay = await ...和判断条件!leaveApproved不匹配,需统一为!stay表示用户选择离开当前页面。

额外注意事项

  • 内存泄漏防护:保留原代码中Unloaded事件的注销逻辑,确保页面卸载时正确移除事件订阅,避免内存泄漏。
  • 导航模式覆盖:根据业务需求补充NavigationMode.Forward等其他模式的处理逻辑。
  • 对话框上下文:确保ContentDialog使用当前页面的XamlRoot,避免线程上下文异常。

内容的提问来源于stack exchange,提问作者BeethovenKodar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:10:14