.NET 9使用Community Toolkit Popup报错:找不到指定方法
问题原因
版本兼容性不匹配
Community Toolkit Maui 11.1.0是针对.NET 8开发的,而你使用的是.NET 9,两者内部API存在差异,导致找不到PropertyPropagationExtensions.PropagatePropertyChanged方法——这个方法在.NET 9的MAUI中已被修改或移除,旧版本Toolkit未适配该变更。服务注册错误
你在MauiProgram.cs中注册的builder.Services.AddTransient<MsgBox, MsgViewModel>()完全错误:AddTransient的泛型参数要求第一个是服务类型,第二个是实现类型,但MsgBox是Popup页面,MsgViewModel是视图模型,两者没有继承/实现关系,这种错误注册会导致依赖注入逻辑混乱,间接引发运行时错误。自动关闭逻辑无效
DisplayPopup方法中Task.Delay(del)没有使用await,代码会跳过等待直接执行popup.Close(),导致Popup刚创建就被关闭,根本无法正常显示。
解决办法
1. 升级Community Toolkit Maui版本
将Community Toolkit Maui升级到适配.NET 9的版本(12.0.0及以上),可以通过NuGet包管理器更新,或者直接修改项目文件:
<PackageReference Include="CommunityToolkit.Maui" Version="12.0.0" />
2. 修正服务注册
删除错误的注册语句,若需要注册视图模型,改为:
builder.Services.AddTransient<MsgViewModel>();
如果你的MsgBox是手动实例化(如当前代码中new MsgBox(txt)),也可以完全移除该视图模型的注册,直接在MsgBox构造中手动创建ViewModel即可。
3. 修复自动关闭逻辑
将DisplayPopup改为异步方法,并添加await等待延迟:
public async Task DisplayPopup(string txt = "Success!", int del = 1000) { var popup = new MsgBox(txt); this.ShowPopup(popup); await Task.Delay(del); popup.Close(); }
调用时也要使用await:
await DisplayPopup("Username is copied.", 750);
内容的提问来源于stack exchange,提问作者Bob Gatto

