在.NET框架下开发跨平台应用程序,如Silverlight、Windows Phone 7、XBox 360等,并非易事。尽管理论上可以通过Portable Class Library(PCL)实现代码的跨平台复用,但实际上支持的范围有限。本文将介绍如何使用MVVM Light框架在Windows Store和Windows Phone平台上进行开发,并实现代码的复用。
MVVM Light是一个轻量级的MVVM框架,适用于Silverlight、WPF、Windows Phone和Windows Store平台。作者已使用该框架多年,并且随着每个新版本的发布,框架的功能也在不断增强。最近,MVVM Light的爱好者Oren Novotny将MVVM Light项目移植到了PCL中,使得代码复用变得更加方便。
打开Visual Studio 2012,创建一个新的项目。首先创建一个空白的Visual Studio解决方案,命名为"MvvmPortable"。然后添加一个Windows Store应用(C#空白模板),命名为"Mvvm.Store"。接着添加一个新的Windows Phone 8项目,命名为"Mvvm.Phone"。最后,添加一个新的PCL项目到解决方案中。
在创建PCL项目时,会弹出一个对话框要求选择支持的平台。除了XBox之外,其他平台都可以选择。对于Windows Phone,选择7.5或更高版本。如果选择了"Windows Phone 7.1或更高"选项,后续添加NuGet包时会出现错误。
如果还没有使用NuGet,请先访问nuget.org网站,或通过Tools->Extensions And Updates进行安装。接下来,通过NuGet添加MVVM Light包到PCL项目中。右键点击项目,选择Manage Nuget Packages,在对话框中搜索"Portable.MvvmLightLibs",并确保勾选了Include Pre-release选项。也可以使用PackageManager控制台,使用命令"install-package portable.mvvmlightlibs -prerelease"进行安装。
对于Windows Phone和Windows Store项目,重复上述过程添加MVVM Light包。
在PCL项目中创建一个名为"ViewModel"的文件夹。然后,在"Mvvm.Store"项目的"ViewModel"文件夹中选择"ViewModelLocator.cs"和"MainViewModel.cs"文件,并将它们复制粘贴到PCL项目的"ViewModel"文件夹中。打开这些文件,将命名空间从"Mvvm.Store.ViewModel"更改为"Mvvm.PCL.ViewModel"。
由于ViewModelLocator已经移动,Store应用需要知道在哪里找到它和ViewModels。打开"Mvvm.Store"项目的"App.xaml"文件,将:
xmlns:vm="using:Mvvm.Store.ViewModel"
更改为:
xmlns:vm="using:Mvvm.PCL.ViewModel"
同时,需要修改Resources部分,因为MvvmLight的NuGet安装器会添加一些额外的ViewModelLocator条目。
最后,对于Store应用,将在"MainPage.xaml"中设置DataContext,并添加一个TextBlock,以便从可移植类库中的"MainViewModel.cs"中填充数据。
Phone项目的过程与Store项目类似。不同的是,不需要移动Phone项目中的ViewModel文件夹,可以直接删除它。
打开"App.xaml"文件,进行调整以让应用程序知道ViewModelLocator和ViewModels的位置。注意,在Phone项目中进行这些引用与Store项目有所不同,虽然微妙但可能会出错。
接下来,打开"MainPage.xaml"文件,添加DataContext声明和TextBlock,就像在Store应用中所做的那样。
MVVM Light框架的其他功能在特定项目中仍然可用,或者也可以将它们提取出来。