You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET 9 MAUI升级CommunityToolkit.Maui 12.1.x后,Popup关闭时如何返回值?

.NET 9 MAUI升级CommunityToolkit.Maui 12.1.x后,Popup关闭时如何返回值?

我刚升级到CommunityToolkit.Maui 12.1.x的时候也踩过这个坑!旧版里CloseAsync(myModel)直接传返回值的写法确实被移除了,不过官方给了更统一的方式,不用折腾EventHandler,按下面的步骤改就行:

第一步:在Popup内部设置Result,再调用无参CloseAsync

在你的LanguagePicker Popup的关闭逻辑里,先把要返回的对象赋值给Popup的Result属性,再调用无参的CloseAsync()

// 比如在Popup的确认按钮点击事件里
private async void ConfirmButton_Clicked(object sender, EventArgs e)
{
    // 把你要返回的myModel赋值给Result
    this.Result = myModel;
    // 调用无参的CloseAsync关闭弹窗
    await CloseAsync();
}

第二步:修复调用Popup的代码(你当前的代码有个小错误)

看你贴的调用代码,你实例化了两次LanguagePicker

var pickerControlView = new LanguagePicker();
var response = await Application.Current.MainPage.ShowPopupAsync( new LanguagePicker());

这会导致你调用的是全新的Popup实例,和你之前创建的pickerControlView没关系,自然拿不到正确的返回值!改成复用同一个实例:

var pickerControlView = new LanguagePicker();
var response = await Application.Current.MainPage.ShowPopupAsync(pickerControlView);
if (response != null)
{
    controls.SelectedItem = (LanguageModel)response;
    controls.SelectedItemChanged?.Invoke(controls, controls.SelectedItem);
}

额外说明:什么时候用EventHandler?

如果你的场景需要在Popup关闭前实时传递中间值,或者需要多个触发事件(比如用户在Popup里选了选项就实时通知主页面),那可以用EventHandler。但只是关闭时返回最终结果的话,用Result属性是官方推荐的最简洁方式,完全够用。

另外,你之前的XAML里有个小语法错误,闭合标签应该是</toolkit:Popup>而不是</toolkit>,修正后更规范:

<?xml version="1.0" encoding="utf-8" ?>
<toolkit:Popup x:Class="LanguageCustomPicker.LanguagePicker"
             xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
             x:Name="lp">
    <!-- 你的Popup内部UI元素 -->
</toolkit:Popup>

这样改完之后,你调用ShowPopupAsync就能拿到Popup关闭时设置的Result值了,和旧版的使用体验几乎一致,只是换了个设置返回值的方式~

火山引擎 最新活动