Xamarin.Forms+Prism—— 基本使用 NavigationService


Xamarin.Forms+Prism(2)—— 基本使用 NavigationService

Xamarin.Forms


本文主要对Prism框架下的导航服务NavigationService进行一次介绍和使用。

1、打开VS,可以看到左侧的已安装模版里面有:

832198-20170417115921540-348935570.png-79.5kB
832198-20170417115927884-755773291.png-15.6kB

2、创建完成后,从PCL项目中,看到App.xaml.cs中的代码知道,程序现在的逻辑是打开APP->NavigationPage->MainPage(传递title参数);

3、先在Views文件夹里面添加一个Prism ContentPage,可以看到LoginPageViewModel会自动在ViewModels添加。

832198-20170417135625243-1542159903.png-51.8kB

4、假如我们现在要修改逻辑打开APP的时候,要判断上次是否登录状态,来判断是否需要跳转到LoginPage:

  现在我们就要修改逻辑,在App.xaml的OnInitialized()里,添加代码;

  1. protected override void OnInitialized()
  2. {
  3. InitializeComponent();
  4. bool isLogin = false;//这里只是一个假设值,真实项目中,应该判断是否已登录。
  5. if (isLogin)
  6. {
  7. //已经登录
  8. NavigationService.NavigateAsync("NavigationPage/MainPage?title=Hello%20from%20Xamarin.Forms");
  9. }
  10. else
  11. {
  12. NavigationService.NavigateAsync("LoginPage");
  13. }
  14. }

在LoginPage的Xaml中添加一个登录按钮,可以看出是MVVM的设计模式:

  1. <Button Text="登录" Command="{Binding LoginCommand}"></Button>

832198-20170417142248290-925736418.png-39.5kB
 修改LoginPageViewModel的代码,新建一个构造函数,参数就是INavigationService,这是Prism自带的导航服务,会自动传递过来的;

  1. public class LoginPageViewModel : BindableBase
  2. {
  3. public LoginPageViewModel()
  4. {
  5. }
  6. private INavigationService _navigationService;
  7. /// <summary>
  8. /// 登录操作绑定的命令
  9. /// </summary>
  10. private DelegateCommand<EventArgs> _loginCommand;
  11. public DelegateCommand<EventArgs> LoginCommand
  12. {
  13. get
  14. {
  15. if (_loginCommand == null)
  16. {
  17. _loginCommand = new DelegateCommand<EventArgs>(async r =>
  18. {
  19. //这里做登录操作,如访问你的WebApi
  20. await Task.Delay(2000);
  21. //这里假如已经做完登录操作,保存用户信息,并跳转到MainPage;
  22. await _navigationService.NavigateAsync("NavigationPage/MainPage");
  23. });
  24. }
  25. return _loginCommand;
  26. }
  27. }
  28. public LoginPageViewModel(INavigationService navigationService)
  29. {
  30. _navigationService = navigationService;
  31. }
  32. }

假如我们现在这样做,用户登录成功点击登录成功,跳转到NavigationPage->MainPage后,用户点击后退,会跳回登录页面。这就需要我们手动设置NavigationService中的栈

把跳转代码修改为,这样我们假如用户点击后退,也不会回到MainPage页面了。

  1. await _navigationService.NavigateAsync("app:///NavigationPage/MainPage");
  2. //await _navigationService.NavigateAsync("NavigationPage/MainPage");

 还有,如果ViewModel类实现INavigationAware接口,会实现3个方法,就是提供导航准备进入,导航已经进入,导出已经跳出三种基类方法。

  1. public void OnNavigatedFrom(NavigationParameters parameters)
  2. {
  3. }
  4. public void OnNavigatingTo(NavigationParameters parameters)
  5. {
  6. }
  7. public void OnNavigatedTo(NavigationParameters parameters)
  8. {
  9. if (parameters.ContainsKey("title"))
  10. Title = (string)parameters["title"] + " and Prism";
  11. }

最后:

  1、要注意程序所有要使用的Page,都需要在App.xaml代码中注册,因为Prism的服务是基于Page的,所以注册的对象基类必须是Page

832198-20170417141535571-84414181.png-81.1kB

2、使用NavigationService进行导航时,填写的字符串Page名字,必须大小写匹配,如写成mainpage,会报错。

  3、程序运行截图:程序运行,直接跳转到LoginPage,点击登录按钮,程序等待2秒后会跳转到MainPage,我们现在可以测试点击后退,会发现直接退出程序,逻辑修改成功。
  
  832198-20170417142230821-2121934994.png-24.1kB

832198-20170417142344806-115120341.png-23.9kB

作者:指尖上的艺术
原文地址:http://www.cnblogs.com/loda7023link/p/6722786.html

分享到