最近有空就把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调度呢?且听下文分解。