类别:.Net 跨平台 / 日期:2015-02-15 / 浏览:4386 / 评论:0
完成了对MVVN light Toolkit的添加后,我们又遇到了一些问题,其中包括怎么从ViewModel中控制跳转页面以及在当前页面弹出提示消息框等。下面我就用比较笨并且比较简单的方法解决这些问题,虽然网上有一些人写的开源项目,但是我用了后总是报错,所有我就自己写了两个类去完成上面说的功能。 首先是NavigationHelper类,该类主要解决的是页面导航的问题,具体代码如下:
/// <summary> /// 导航帮助类 /// </summary> public static class NavigationHelper { public static INavigation Navi { get; internal set; } public static Task<Page> PopAsync() { return Navi.PopAsync(); } public static Task<Page> PopModalAsync() { return Navi.PopModalAsync(); } public static Task PopToRootAsync() { return Navi.PopToRootAsync(); } public static Task PushAsync(Page page) { return Navi.PushAsync(page); } public static Task PushModalAsync(Page page) { return Navi.PushModalAsync(page); } }
接下来是MessageDialogHelper类,主要解决页面弹出消息框的问题,具体代码如下:
/// <summary> /// 提示框帮助类 /// </summary> public static class MessageDialogHelper { public static Page CurrentPage { get; internal set; } public static Task DisplayAlert(string title, string message, string cancel) { return CurrentPage.DisplayAlert(title, message, cancel); } public static Task<bool> DisplayAlert(string title, string message, string accept, string cancel) { return CurrentPage.DisplayAlert(title, message, accept, cancel); } }
最后我们修改UI项目中的App.cs中的代码:
public static Page GetMainPage() { var mainPage = new MainPage(); NavigationHelper.Navi = mainPage.Navigation; MessageDialogHelper.CurrentPage = mainPage; return mainPage; }
这样就简单的实现了我们需要的功能,我们在ViewModel直接调用这些静态类的静态方法就可以实现我们所要的功能了。 接下来我们还有一个需求,就是添加一个显示Loading的功能,因为该功能不仅仅涉及到UI层,同时在不同的平台需要调用接口也不一样,利用之前搭建的MVVM Light Toolkit,我们在不同的项目中注册就可以在UI层中通过统一的接口调用了。下面我简单说下。 我们在https://github.com/aritchie/acr-xamarin-forms 下载引用到项目中,或者使用Nuget方式安装。
向Android项目MainActivity.cs类的OnCreate方法中以及IOS项目中的AppDelegate.cs类的FinishedLaunching方法添加如下代码:
SimpleIoc.Default.Register<IUserDialogService,UserDialogService>();
然后我们就可以在ViewModel中使用Loading框了,代码如下:
public MainViewModel(IUserDialogService userDialogService) { _userDialogService = userDialogService; } _userDialogService.ShowLoading("加载中"); //执行一些代码 _userDialogService.HideLoading();
最后还有一点需要说明的是,之前WPF和WP下我们可以使用Trigger去绑定事件的Command,但是在Xamarin Forms中并没有提供,但是我们可以用Forms.Behaviors去解决,下载地址:https://github.com/corradocavalli/Xamarin.Forms.Behaviors 对于这个,我们只需要将Xamarin.Behaviors和.nuget文件夹复制到我们的项目中,在解决方案上右键选择添加现有项,然后选择Xamarin.Behaviors下的项目文件,最后升级该项目的Xamarin.Forms的版本,并在其他项目中添加对该项目的引用,下面对使用举个简单的例子。 首先我们要给IOS项目中AppDelegat.cs下的FinishedLaunching方法中添加一行代码:
Xamarin.Behaviors.Infrastructure.Init();
比如我给一个DatePicker的DateSelected添加一个Command,代码如下:
<DatePicker WidthRequest="180" Format="D" Date="{Binding DateSelected,Mode=TwoWay}" > <b:Interaction.Behaviors> <b:BehaviorCollection> <b:EventToCommand EventName="DateSelected" Command="{Binding DateSelectedCommand}"></b:EventToCommand> </b:BehaviorCollection> </b:Interaction.Behaviors> </DatePicker>
还有一个要注意的:在ViewModelLocator中注册的接口中方法的返回值如果是数组类型的,在ViewModel中调用的时候会抛出异常,建议用IList<>泛型替代。 至此,Xamarin Forms部分就结束了,在接下来的时间我又有了新的任务,就是微信的开发,希望有机会跟大家一起分享!
发表评论 /