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

.NET MAUI中如何通过Mopups弹窗返回值?

使用Mopups实现弹窗关闭后返回值

要实现自定义弹窗关闭后返回值,你可以参考以下两种方式来实现:

方式一:通过ViewModel属性传递结果

1. 自定义弹窗ViewModel

在弹窗的ViewModel中添加结果存储属性,以及触发弹窗关闭的命令:

public class ConfirmationPopupViewModel : ObservableObject
{
    private readonly IPopupNavigation _popupNavigation;
    public ICommand ConfirmCommand { get; }
    public ICommand CancelCommand { get; }
    
    // 用于存储弹窗返回结果
    public bool? Result { get; private set; }

    public ConfirmationPopupViewModel(IPopupNavigation popupNavigation)
    {
        _popupNavigation = popupNavigation;
        ConfirmCommand = new Command(() => ClosePopup(true));
        CancelCommand = new Command(() => ClosePopup(false));
    }

    private void ClosePopup(bool isConfirmed)
    {
        Result = isConfirmed;
        _popupNavigation.PopAsync();
    }
}

2. 弹窗页面绑定命令

在弹窗的XAML中,将确认、取消按钮与ViewModel的命令绑定:

<mopups:PopupPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
                  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                  xmlns:mopups="clr-namespace:Mopups.Pages;assembly=Mopups"
                  x:Class="YourAppNamespace.ConfirmationPopup"
                  BindingContext="{Binding Source={StaticResource ConfirmationPopupViewModel}}">
    <VerticalStackLayout Padding="20" Spacing="15">
        <Label Text="Do you really want to delete this card?" />
        <HorizontalStackLayout Spacing="10">
            <Button Text="Cancel" Command="{Binding CancelCommand}" />
            <Button Text="OK" Command="{Binding ConfirmCommand}" />
        </HorizontalStackLayout>
    </VerticalStackLayout>
</mopups:PopupPage>

3. 调用弹窗并获取结果

在需要弹窗的地方,实例化弹窗和ViewModel,等待弹窗关闭后直接读取ViewModel的结果属性:

var viewModel = new ConfirmationPopupViewModel(popupService);
var confirmationPopup = new ConfirmationPopup { BindingContext = viewModel };

// 显示弹窗,等待关闭
await popupService.PushAsync(confirmationPopup);

// 获取返回结果
bool? isConfirmed = viewModel.Result;
if (isConfirmed == true)
{
    // 执行删除逻辑
}
else
{
    // 取消操作
}

方式二:通过事件回调传递结果

适合更复杂的场景,通过ViewModel定义事件,弹窗关闭时触发事件传递结果:

1. 改造ViewModel添加事件

public class ConfirmationPopupViewModel : ObservableObject
{
    private readonly IPopupNavigation _popupNavigation;
    public ICommand ConfirmCommand { get; }
    public ICommand CancelCommand { get; }
    
    // 定义弹窗关闭事件
    public event Action<bool>? OnPopupClosed;

    public ConfirmationPopupViewModel(IPopupNavigation popupNavigation)
    {
        _popupNavigation = popupNavigation;
        ConfirmCommand = new Command(() => ClosePopup(true));
        CancelCommand = new Command(() => ClosePopup(false));
    }

    private void ClosePopup(bool isConfirmed)
    {
        OnPopupClosed?.Invoke(isConfirmed);
        _popupNavigation.PopAsync();
    }
}

2. 调用方订阅事件获取结果

var viewModel = new ConfirmationPopupViewModel(popupService);
// 订阅事件获取结果
viewModel.OnPopupClosed += (isConfirmed) =>
{
    if (isConfirmed)
    {
        // 处理确认逻辑
    }
};
var confirmationPopup = new ConfirmationPopup { BindingContext = viewModel };
await popupService.PushAsync(confirmationPopup);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:52:49