如何在.NET MAUI Shell应用中识别用户当前所在页面?
.NET MAUI Shell 中识别当前页面实现分级聊天通知方案
核心思路
利用.NET MAUI Shell的内置导航状态API,在ChatService中直接获取当前活跃页面的信息,以此判断用户所处场景,选择对应的通知方式。
具体实现步骤
获取当前Shell实例与活跃页面
由于应用基于Shell构建,Application.Current.MainPage即为Shell实例。通过Shell的NavigationStack(处理子页面导航)和CurrentItem(处理标签页选中状态),可以定位到当前用户正在查看的页面。判断是否处于聊天页面
通过页面类型或路由两种方式校验:- 类型校验:直接判断当前页面是否为
ChatPage实例 - 路由校验:若标签页配置了路由,可通过
CurrentItem.Route匹配聊天页路由
- 类型校验:直接判断当前页面是否为
根据场景选择通知逻辑
结合AppInfo.Current.State判断应用是否在前台,再配合页面判断结果,执行不同的音频通知逻辑。
代码示例(ChatService中实现)
public async Task MessageReceived(Message message) { // 应用未在前台时,交由Azure Notification Hubs处理,直接返回 if (AppInfo.Current.State != AppState.Active) { return; } Page currentActivePage = null; var shell = Shell.Current; if (shell != null) { // 优先获取导航栈顶部的子页面(如从标签页跳转的聊天子页) currentActivePage = shell.Navigation.NavigationStack.LastOrDefault(); // 导航栈为空时,取当前选中的标签页内容 if (currentActivePage == null) { var selectedShellContent = shell.CurrentItem as ShellContent; currentActivePage = selectedShellContent?.Content as Page; } } // 判断是否处于聊天页面 bool isOnChatPage = currentActivePage is ChatPage; // 执行对应通知逻辑 if (isOnChatPage) { await PlaySoftNotificationSound(); } else { await PlayLoudNotificationSound(); } } // 示例音频播放方法(可根据实际需求替换为MediaElement或原生音频API) private Task PlaySoftNotificationSound() { // 实现轻柔音频播放逻辑 return Task.CompletedTask; } private Task PlayLoudNotificationSound() { // 实现响亮音频播放逻辑 return Task.CompletedTask; }
注意事项
- 确保
ChatPage在Shell的标签页或导航栈中正确实例化,避免空引用 - 若聊天页面是动态导航的子页面,需保证
NavigationStack能正确捕获到该页面 - 音频播放可使用.NET MAUI内置的
MediaElement控件,或封装原生平台的音频播放API
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

