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
相关产品推荐
相关产品推荐

