类别:.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部分就结束了,在接下来的时间我又有了新的任务,就是微信的开发,希望有机会跟大家一起分享!

可能感兴趣的文章

评论区

发表评论 /

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。