Xamarin.Forms跨平台开发入门-第二部分:深入解析,
英文原文:
https://developer.xamarin.com/guides/xamarin-forms/getting-started/hello-xamarin-forms/deepdive/#
本文的第一部分内容建立了Phoneword应用。本文是第二部分,回顾了构建的内容以了解Xamarin.Forms 应用程序的基本工作原理。
我们要讨论下面一些问题:
- Visual Studio简介,建立一个新的Xamarin.Forms应用的简介。
- 剖析Xamarin.Forms 应用,介绍应用的基本组成部分。
- 架构和应用程序基础-每个平台是怎么启动应用的。
- 在Xamarin.Forms应用中建立用户界面。
- Phoneword中涉及到的一些额外的概念。
- 测试和发布-测试,发布,生成作品的一些建议。
Visual Studio简介
Visual Studio 是微软公司的一个强大的IDE。它完整地集成了可视化设计器,文本编辑器,优化重构工具,包管理器,源代码集成等。本文介绍Xamarin 插件相关的一些基本特征。
Visual Studio 将代码组织成解决方案和项目。一个解决方案是一个容器,他可以容纳一个或多个工程。可以是一个应用工程,支持库工程,测试工程或其他工程。Phoneword应用包含一个解决方案,里面有六个工程,如下图。
这些项目是:
Phoneword-本项目是可移植的类库项目,所有的共享的代码和共享UI都在里面。
Phoneword.Droid - 专门针对Android系统的代码,和Android应用的入口。
Phoneword.IOS -专门针对IOS系统的代码,和IOS应用的入口
Phoneword.UWP-专门针对Windows通用平台(UWP)系统的代码,和该平台应用的入口
Phoneword.WinPhone- 包含专门针与Windows Phone平台的代码,和Windows Phone 8.0 应用的入口。
Phoneword.WinPhone81- 包含专门针与Windows Phone8.1平台的代码,和Windows Phone 8.1 应用的入口。
Xamarin.Forms应用的剖析。
下图显示了Visual Studio中Phoneword PCL工程所包含的内容。
这一工程包含两个文件夹:
Reference - 包含本应用必需的构建和运行时所需要的库文件。
Properties-包含AssemblyInfo.cs,他是一个.NET库的元文件,在它里面放一些关于应用程序的基本信息,这是一个好习惯,关于此文件的更多信息,请参见MSDN 上的AssemblyInfo 类。
工程中还包含一些文件:
App.xaml - XAML App 类对应的标记文件,为应用程序定义了资源字典。
App.xaml.cs - App类的代码文件,包含了初始化并显示第一个页面,还要控制着应用程序生命周期事件。
IDialer.cs - IDialer接口,指明了实现类中必须实现的Dial方法。
MainPage.xaml - MainPage 类的XAML标记文件。定义了本应用启动时的页面的界面元素(UI)。
MainPage.xaml.cs- MainPagel类的代码。包含了用户与界面交互的业务逻辑。
Packages.config-一个XML文件,包含了关于NuGet包的一些信息,用来跟踪必须的包文件和相应的版本。Xamarin Studio 和Visual Studio都可以配置成自动恢复缺失的Nuget包,当你与其他程序员共享代码时,这个文件里包含的内容有NuGet管理器所控制。
PhoneTranslator.cs - 将电话单词转换成电话号码的业务逻辑,被MainPage.xaml.cs所使用。
更多的Xamarin.IOS应用的剖析内容,请参见https://developer.xamarin.com/guides/ios/getting_started/hello,_ios/hello,_ios_deepdive#Anatomy_of_a_Xamarin.iOS_Application/
更多的Xamarin.Android应用的剖析内容,请参见
https://developer.xamarin.com/guides/android/getting_started/hello,android/hello,android_deepdive#Anatomy_of_a_Xamarin.Android_Application/
体系结构和应用程序基础构成
和传统的跨平台应用类似,Xamarin.Forms 应用将共享的代码放入可移植类库(PCL)内,平台相关的应用消费这些共享的代码,下图展示说明了Phoneword应用的各个部分的关系:
关于PCL的更多的信息,请参考
https://developer.xamarin.com/guides/cross-platform/application_fundamentals/pcl/introduction_to_portable_class_libraries/
为了最大化重用启动代码,Xamarin.Forms应用有一个单独的类,叫做App,负责每一个平台的第一个页面的初始化工作,如下代码所示:
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace Phoneword
{
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new MainPage();
}
...
}
}
这段代码将一个一个新的Mainpage实例赋值给App的MainPage属性。XamlCompilation 属性打开了XAML 编译器,以使XAML被编译成中间语言。更多的关于XAML的内容,请参见
https://developer.xamarin.com/guides/xamarin-forms/xaml/xamlc/
在各个平台上启动应用
IOS
要在IOS上执行Xamarin.Forms 页面,Phoneword.IOS工程包含了继承自FormsApplicationDelegate 的AppDelegate类,如下代码所示:
namespace Phoneword.iOS
{
[Register ("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init ();
LoadApplication (new App ());
return base.FinishedLaunching (app, options);
}
}
}
通过调用Init方法,FinishedLaunching方法覆盖了初始化Xamarin.Forms框架的过程。这使得IOS平台上实现了通过调用LoadApplication方法让Xamarin.Forms在根View Controller被设置之前被调用。
Android
为了在Android系统上启动Xamarin.forms页面,Phoneword.Droid工程包含了创建一个带有MainLauncher 属性的 Activity代码,这个Activity集成自formsApplicationActivity类。如下所示: