最近有空就把Xamarin的默认项目打开看了看,写一个Xamain学习系列。前期准备:环境搭建:这里。首先新建一个默认的Xamarin单元提纲项目,里面有一些Xamarin的示例代码,建立的过程有几个选项
之前有一篇文章已经说过关于UI技术的选择,这里重新说一下:使用Xamarin.Forms不同平台共享界面代码(Xaml),如果熟悉wpf,uwp或者愿意学习Xaml选择此项,不同平台共享前端代码。选择本机,每个平台分别写前端代码,和单独开发区别不大,只不过做到了用C#语言开发而已,毫无疑问,使用Xamarin.Froms明显是我们想要的。代码共享策略,这个就区别不是很大了,我的理解是共享项目是通过将Xamarin项目附加到每个平台上进行编译,每个平台项目编译时Xamarin项目都需要跟随编译,可以移植类库使用了微软跨平台框架,Xamarin产生一个Dll文件(类似吧),可以插入各个平台中,我的观点区别不大,但可移植性应该是PCL好一些,选PCL(可能)好一些,但共享项目也不错。
新建一个Xamarin项目如下图所示:
首先来理解这个项目,新建的Xamarin共4个项目,一个Xamarin3个分平台,iOS、Android、Win,其中Win平台是通用应用UWP。建立的是XamarinUI的项目,因此Xamarin项目使用Xaml代码编写界面。
找到程序入口点:Xamarin中并没有发现程序入口点,发现程序入口在分平台之中。比如Android
namespace App2.Droid { [Activity(Label = "@string/app_name", Theme = "@style/MyTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); global::Xamarin.Forms.Forms.Init(this, bundle); LoadApplication(new App()); } } }
LoadApplication(new App());这句将任务传递给了Xamarin,因为App是Xamarin建立的类,继承自Application。类如下:
[assembly: XamlCompilation(XamlCompilationOptions.Compile)] namespace App2 { public partial class App : Application { public App() { InitializeComponent(); SetMainPage(); } public static void SetMainPage() { Current.MainPage = new TabbedPage { Children = { new NavigationPage(new ItemsPage()) { Title = "Browse", Icon = Device.OnPlatform("tab_feed.png",null,null) }, new NavigationPage(new AboutPage()) { Title = "About", Icon = Device.OnPlatform("tab_about.png",null,null) }, } }; } } }注意,Current.MainPage设置了主界面,或者当前启动界面,关于一点需要说明下面这句代码:
Icon = Device.OnPlatform("tab_feed.png",null,null)根据平台不同使用不同的资源,发现这段代码已经过时,新的方法如下:
switch (Device.RuntimePlatform) { case Device.iOS: break; case Device.Android: break; case Device.Windows: break; default: break; }虽然长度有所增加,但更直观了,这样分平台就把主任务交给了Xamarin来处理了,而分平台各自的差异性代码如何被Xamarin调度呢?且听下文分解。