You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms中如何在非页面类中正确调用Navigation.PushAsync()?

解决Xamarin.Forms中独立类调用Navigation.PushAsync报错的问题

方法一:给独立类传递Navigation对象

独立类没继承Page,自然没有自带的Navigation属性,最直接的办法就是在调用这个类的时候,把MainPage的Navigation传进去:

在MainPage里调用MyClass:

var myClass = new MyClass(Navigation);
await myClass.DoNavigation();

MyClass的代码修改成这样:

class MyClass
{
    private INavigation _navigation;
    // 通过构造函数接收Navigation对象
    public MyClass(INavigation navigation)
    {
        _navigation = navigation;
    }

    public async Task DoNavigation()
    {
        await _navigation.PushAsync(new MyPage());
    }
}

方法二:直接用App.Current.MainPage的Navigation

如果不想传参数,也可以直接通过应用的当前主页面获取Navigation,前提是你的MainPage是NavigationPage类型(也就是App启动时把MainPage包装在NavigationPage里):

MyClass里直接写:

await App.Current.MainPage.Navigation.PushAsync(new MyPage());

要是你的App还没把MainPage设为导航容器,记得在App.xaml.cs里初始化时改一下:

MainPage = new NavigationPage(new MainPage());

方法三:让页面处理导航(更推荐)

导航属于UI层操作,独立类最好专注业务逻辑,把导航的事儿交回给调用它的页面。比如用事件通知页面执行导航:

MyClass的代码:

class MyClass
{
    // 定义一个事件,通知页面需要导航
    public event Action OnNavigationNeeded;

    public async Task DoBusinessStuff()
    {
        // 先执行你的业务逻辑
        // ...
        // 触发事件,让页面去处理导航
        OnNavigationNeeded?.Invoke();
    }
}

然后在MainPage里订阅这个事件:

var myClass = new MyClass();
// 订阅事件,收到通知就执行导航
myClass.OnNavigationNeeded += async () => await Navigation.PushAsync(new MyPage());
await myClass.DoBusinessStuff();

内容的提问来源于stack exchange,提问作者Costas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:13:19