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

如何获取跳转来源页面名称?Shell导航栈用nameof报错求解决

正确获取MAUI中来源页面名称的方法

先解决你当前的代码错误

你用nameof(stack[indexForPreviousPage])报错,是因为nameof()只能获取编译期已知符号的名称(比如类型、变量名),而stack[indexForPreviousPage]是运行时的Page实例,没法直接用nameof()处理。修复后的代码如下:

var stack = Shell.Current.Navigation.NavigationStack.ToArray();
var indexForPreviousPage = stack.Length - 2;
// 必须判断索引有效性,避免导航栈元素不足导致越界
if (indexForPreviousPage >= 0)
{
    var previousPage = stack[indexForPreviousPage];
    // 直接对比类型(推荐,避免名称冲突)
    if (previousPage.GetType() == typeof(SomePageInMyApp))
    {
        // 执行你的逻辑
    }
    // 或者对比类型名称字符串
    // if (previousPage.GetType().Name == nameof(SomePageInMyApp))
    // {
    //     // 执行逻辑
    // }
}

更简便的替代方案

1. 导航时主动传递来源标识

这是最直接的方式,不需要依赖导航栈。在跳转页面时,把来源页面的信息作为参数传递:

// 从SomePageInMyApp跳转到目标页面时
await Shell.Current.GoToAsync(nameof(TargetPage), new Dictionary<string, object>
{
    { "SourcePage", nameof(SomePageInMyApp) }
});

然后在目标页面的ViewModel中,通过QueryProperty接收参数:

[QueryProperty(nameof(SourcePage), "SourcePage")]
public string SourcePage { get; set; }

// 在需要判断的地方直接使用
if (SourcePage == nameof(SomePageInMyApp))
{
    // 执行逻辑
}

2. 监听Shell导航事件记录来源

在全局层面监听导航事件,自动记录每次跳转的来源页面:

// 在App.xaml.cs的OnStart方法中注册事件
protected override void OnStart()
{
    Shell.Current.Navigated += (sender, e) =>
    {
        if (e.Previous != null)
        {
            // 将来源页面类型名称存入全局属性
            App.Current.Properties["LastSourcePage"] = e.Previous.GetType().Name;
        }
    };
}

之后在ViewModel中读取全局属性判断:

if (App.Current.Properties.TryGetValue("LastSourcePage", out var sourcePage) 
    && sourcePage.ToString() == nameof(SomePageInMyApp))
{
    // 执行逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:12:45