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

.NET MAUI中如何从其他视图关闭加载弹窗?

解决方案

方案1:用消息中心实现跨页面通知关闭弹窗

这是解耦性最好的方案,适合跨页面通信场景:

  1. 在原页面的ItemSelected方法中注册消息监听:
async void ItemSelected(object sender, SelectionChangedEventArgs e)
{
    var popup = new LoadingPopup();
    this.ShowPopup(popup);
    
    // 注册关闭弹窗的消息监听
    var token = WeakReferenceMessenger.Default.Register<CloseLoadingPopupMessage>(this, (r, m) =>
    {
        popup.Close();
        WeakReferenceMessenger.Default.Unregister(token); // 用完注销避免内存泄漏
    });
    
    var item = e.CurrentSelection.FirstOrDefault();
    if (item != null)
    {
        await Navigation.PushAsync(new YearPage(item) {BindingContext = item });
    }
}
  1. 创建消息标记类(可单独放在一个工具类文件中):
public class CloseLoadingPopupMessage
{
    // 仅作为消息标记,无需额外属性
}
  1. 在YearPage的加载完成逻辑(比如异步数据加载结束后)发送关闭消息:
// 假设这是YearPage中加载数据的异步方法
await LoadYearDataAsync();
// 发送关闭弹窗的消息
WeakReferenceMessenger.Default.Send(new CloseLoadingPopupMessage());

方案2:直接传递弹窗实例给YearPage

这种方式更直接,但要注意避免内存泄漏:

  1. 修改YearPage的构造函数,接收Popup实例:
public class YearPage : ContentPage
{
    private readonly LoadingPopup _loadingPopup;
    
    public YearPage(object item, LoadingPopup loadingPopup)
    {
        _loadingPopup = loadingPopup;
        BindingContext = item;
        InitializeComponent();
    }
    
    // 在页面加载完成后关闭弹窗
    protected override async void OnAppearing()
    {
        base.OnAppearing();
        await LoadRequiredDataAsync();
        _loadingPopup?.Close();
    }
}
  1. 修改原页面的ItemSelected方法:
async void ItemSelected(object sender, SelectionChangedEventArgs e)
{
    var popup = new LoadingPopup();
    this.ShowPopup(popup);
    
    var item = e.CurrentSelection.FirstOrDefault();
    if (item != null)
    {
        await Navigation.PushAsync(new YearPage(item, popup) {BindingContext = item });
    }
}

方案3:将加载逻辑移到原页面,完成后再导航

如果YearPage的核心加载逻辑可以前置到原页面执行,可采用此方案:

async void ItemSelected(object sender, SelectionChangedEventArgs e)
{
    var popup = new LoadingPopup();
    this.ShowPopup(popup);
    
    var item = e.CurrentSelection.FirstOrDefault();
    if (item != null)
    {
        try
        {
            // 执行YearPage需要的加载逻辑
            await PrepareYearPageDataAsync(item);
            // 加载完成后关闭弹窗
            popup.Close();
            // 导航到YearPage
            await Navigation.PushAsync(new YearPage(item) {BindingContext = item });
        }
        catch (Exception ex)
        {
            popup.Close();
            // 这里处理加载异常
        }
    }
}

关键注意事项

  • 优先使用WeakReferenceMessenger(.NET MAUI官方推荐)替代旧的MessagingCenter,可有效避免内存泄漏。
  • 所有方案都要在异常分支中关闭弹窗,防止弹窗一直停留在界面上。
  • 若采用方案2,建议用弱引用包装Popup实例,进一步降低内存泄漏风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:10:55