MAUI怎么传递参数到新页面 MAUI导航传参步骤

来源:这里教程网 时间:2026-02-21 17:35:47 作者:

MAUI 里传递参数到新页面,核心是用 ShellNavigationPage 的导航机制配合路由参数(Route Parameters)或查询字符串(Query Attributes),不推荐直接传对象引用。

使用 Shell 路由 + QueryProperty 传参(推荐)

这是 MAUI 官方推荐、类型安全、支持深度链接的方式。关键三步:

在目标页面(如 DetailPage.xaml.cs)上,给需要接收的属性加上
[QueryProperty]
特性,并确保属性有 public set 访问器
在 AppShell 中注册带参数占位符的路由,例如:
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 或构造函数后自动触发(注意:构造函数中还拿不到)
}

用 Navigation.PushAsync 传简单参数(适合非 Shell 项目)

如果没用 Shell,而是基于

NavigationPage
,可手动在跳转前设置参数:

新建页面实例时,通过构造函数传参(最直接):
var page = new DetailPage("123", "Hello");<br>await Navigation.PushAsync(page);
或定义公共属性,在 Push 前赋值:
var page = new DetailPage();<br>page.ItemId = "123";<br>page.Title = "Hello";<br>await Navigation.PushAsync(page);

⚠️ 注意:这种方式不支持 URI 导航和热重载调试,适合小型或原型项目。

传复杂对象?别直接传,改用服务或 ID 查找

MAUI 不支持跨页面序列化传递自定义对象(尤其含事件、BindingContext 等)。正确做法是:

只传唯一标识(如 int id 或 string key) 在目标页通过
IEnumerable<t></t>
或注入的数据服务(如
IDataService
)按 ID 查询真实数据
或使用
WeakReferenceMessenger
发送消息(适合解耦但非导航主流程)

接收参数后的处理时机

[QueryProperty]
时,属性会在页面初始化后期被自动赋值,但不是在构造函数里。建议:

OnAppearing()
中使用参数加载数据(最常用)
或监听属性 setter,触发刷新逻辑(需手动实现 INotifyPropertyChanged) 避免在构造函数里依赖这些参数——它们此时还是默认值

基本上就这些。关键是选对方式:Shell 项目优先走 Route + QueryProperty;简单跳转用构造函数;复杂数据靠 ID + 服务查。不复杂但容易忽略细节。

相关推荐