.NET Maui从模态页返回时如何在原页面触发代码?
解决.NET MAUI模态页返回后执行代码的问题
针对你通过await Navigation.PushModalAsync(new PageB());从页面A打开模态页B,返回后需要在页面A执行指定代码的需求,以下是几种可靠的实现方案:
方法1:利用PushModalAsync的Task完成回调
PushModalAsync返回的Task会在模态页关闭时自动完成,只需在await语句后直接编写要执行的代码即可,这是最直接的实现方式:
// 页面A的导航逻辑中 await Navigation.PushModalAsync(new PageB()); // 模态页关闭后,此处代码会自动执行 YourTargetMethod(); // 替换为你需要执行的指定代码
方法2:重写页面A的OnAppearing生命周期方法
当模态页关闭回到页面A时,页面A的OnAppearing方法会被触发。如果需要区分首次加载和模态返回的场景,可以通过标记变量实现:
// 页面A的代码中 private bool _isFirstLoad = true; protected override void OnAppearing() { base.OnAppearing(); if (!_isFirstLoad) { // 此处编写模态返回后要执行的代码 YourTargetMethod(); } _isFirstLoad = false; }
方法3:弱引用消息传递(低耦合场景)
如果页面A和B需要保持低耦合,可使用MAUI内置的WeakReferenceMessenger实现跨页面通信:
- 在页面A中注册消息监听:
// 页面A的构造函数或OnAppearing方法中注册 WeakReferenceMessenger.Default.Register<ModalReturnMessage>(this, (sender, message) => { // 收到消息后执行指定代码 YourTargetMethod(); }); // 定义消息类(可放在项目公共类文件中) public class ModalReturnMessage { }
- 在页面B关闭时发送消息:
// 页面B的返回逻辑中(例如返回按钮点击事件) WeakReferenceMessenger.Default.Send(new ModalReturnMessage()); await Navigation.PopModalAsync();
注意:为避免内存泄漏,需在页面A的OnDisappearing方法中注销监听:
protected override void OnDisappearing() { base.OnDisappearing(); WeakReferenceMessenger.Default.Unregister<ModalReturnMessage>(this); }
内容的提问来源于stack exchange,提问作者Thomas Carlton
相关产品推荐
相关产品推荐

