MAUI中传递参数到新页面推荐使用Shell路由配合QueryProperty特性,需在目标页属性标注[QueryProperty]、AppShell注册带占位符路由、调用GoToAsync传参;非Shell项目可用构造函数或公共属性传简单参数;复杂对象应仅传ID并通过服务查询。
MAUI 里传递参数到新页面,核心是用 Shell 或 NavigationPage 的导航机制配合路由参数(Route Parameters)或查询字符串(Query Attributes),不推荐直接传对象引用。
这是 MAUI 官方推荐、类型安全、支持深度链接的方式。关键三步:
[QueryProperty] 特性,并确保属性有 public set 访问器Routing.RegisterRoute("detail/{id}", typeof(DetailPage));
Shell.Current.GoToAsync("detail/123") 或带查询参数:Shell.Current.GoToAsync("detail/123?title=Hello&category=News");
对应页面示例:
[QueryProperty(nameof(ItemId), "id")]
[QueryProperty(nameof(Title), "title")]
public partial class DetailPage : ContentPage
{
public string ItemId { get; set; }
public string Title { get; set; }
// 属性被赋值后,OnAppearing 或构造函数后自动触发(注意:构造函数中还拿不到)
}
如果没用 Shell,而是基于 NavigationPage,可手动在跳转前设置参数:
var page = new DetailPage("123", "Hello");
await Navigation.PushAsync(page);var page = new DetailPage();
page.ItemId = "123";
page.Title = "Hello";
await Navigation.PushAsync(page);
⚠️ 注意:这种方式不支持 URI 导航和热重载调试,适合小型或原型项目。
MAUI 不支持跨页面序列化传递自定义对象(尤其含事件、BindingContext 等)。正确做法是:
IEnumerable 或注入的数据服务(如 IDataService)按 ID 查询真实数据WeakReferenceMessenger 发送消息(适合解耦但非导航主流程)用 [QueryProperty] 时,属性会在页面初始化后期被自动赋值,但不是在构造函数里。建议:
OnAppearing() 中使用参数加载数据(最常用)基本上就这些。关键是选对方式:Shell 项目优先走 Route + QueryProperty;简单跳转用构造函数;复杂数据靠 ID + 服务查。不复杂但容易忽略细节。