.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值了,和旧版的使用体验几乎一致,只是换了个设置返回值的方式~




