如何获取跳转来源页面名称?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
相关产品推荐
相关产品推荐

