Xamarin.Forms 简介
An Introduction to Xamarin.Forms
来源:http://developer.xamarin.com/guides/cross-platform/xamarin-forms/introduction-to-xamarin-forms/
概览
Xamarin.Forms 是一个帮助开发者快速创建跨平台UI的框架。它为ios,Android,Windows Phone上的原生控件的使用提供了一层抽象.这意味着应用程序之间可以共享大部分UI代码,同时还能保持相应平台的界面外观样式。
Xamarin.Forms使用C#编写,能够适应于快速开发越来越复杂的应用程序。因为采用 Xamarin.Form的应用程序是原生应用程序,不必受制于其他类似开发工具包的限制,如浏览器沙箱, 有限的API,糟糕的性能. 使用 Xamarin.Forms编写的程序能够使用下层平台的任何API或者特性,包括但不限于CoreMotion, PassKit, and StoreKit 之于iOS; NFC 和Google Play Services 之于 Android; Tiles 之于 Windows Phone.这也意味着你可以开发一个应用程序部分使用 Xamarin.Forms创建的UI,部分使用原生 UI 开发包来编写.
Xamarin.Forms 应用程序和传统的跨平台应用的架构是一样的。. 最常见的办法是使用 Portable Libraries 或者 Shared Projects 来共享代码, 然后创建平台相关的项目来消费使用共享代码.
Xamarin.Forms使用两种方式创建用户界面。第一种是用Xamarin Forms提供的API直接在源代码里创建UI,另一种可选的方法是使用 Extensible Application Markup Language (XAML),(一种MS用于定义界面的标记语言). 用户界面将使用XAML定义在一个XML文件中,运行时的行为则被定义在单独的代码文件中。了解更多关于XAML,可以阅读 XAML Overview 文档 What is XAML.
本指南只是Xamarin Forms框架基础,包含以下主题
- 安装Xamarin.Forms.
- 在 Visual Studio 或Xamarin Studio中新建解决方案.
- 如何使用Xamarin.Forms中的页面和控件
- 如何在页面间导航
- 如何设置数据绑定
要求
Xamarin.Forms 应用程序可以运行在如下移动操作系统中:
- Android 4.0 或以上
- iOS 6.1 或以上
- Windows Phone 8 (使用Visual Studio)
Xamarin.Forms 为了部分控件(如DatePicker)需要要求安装 Windows Phone Toolkit .
我们假定开发者已经熟悉 Portable Class Libraries 和Shared Projects用法
Mac 系统要求
在OSX上开发Xamarin.Forms程序需要安装Xamarin Studio 5 . 开发iOS程序则要求安装 Xcode 5 (操作系统要求 OS X 10.8 或以上). Windows Phone 程序没法在OSX上开发; IDE也没法创建包含Window Phone的项目模板.
Windows 系统要求
Xamarin.Forms 应用程序可以使用Visual Studio 2012(或更新的版本)开发.
- PCL 解决方案模板需要.NET 4.5上的Profile 78 ( Visual Studio 2012 可以安装Net4.5, Visual Studio 2013已内置). 同时需要安装Windows Phone SDK ,否则会发生 Project type not supported 的错误.
- Shared Project 项目模板需要安装 Visual Studio 2013 Update 2.
开始使用Xamarin Forms
在开始下面的讨论前, 我们需要了解,Xamarin.Forms 其实是以 .NET Portable Class Library (PCL可移植类库)的形式实现,因为这样可以在多平台很方便的共享API. 创建应用程序的第一步就是创建解决方案文件
一个Xamarin.Forms 解决方案通常有以下项目组成:
- Portable Library - 这个项目是包含所有共享UI和其他共享的代码用于跨平台应用程序的类库.
- Xamarin.Android Application - 这个项目包含Android相关的代码和一个Android版应用程序的入口点函数.
- Xamarin.iOS Application - 这个项目包含iOS相关的代码和一个IOS版应用程序的入口点函数.
- Windows Phone Application - 这个项目包含Windows Phone相关的代码和一个Windows Phone版应用程序的入口点函数.
Xamarin 3.0 提供的解决方案模板,可以创建一个Xamarin Forms程序所必须的所有项目。
在 Xamarin Studio 中, 选File > New > Solution. 在新建解决方案对话框中选C# > Mobile Apps, 然后选择 Blank App (Xamarin.Forms Portable) .下面是该操作的截图:
输入项目名,并按OK按钮就可以了. 模板会创建一个包含三个项目的解决方案.
使用Xamarin Studio 创建的解决方案不包含 Windows Phone 项目. 使用Visual Studio 新建 Xamarin.Forms 解决方案的话则支持 iOS, Android和 Windows Phone. 需要注意的是虽然 Xamarin Studio不支持创建Windows Phone 应用程序,但是他还是能够打开一个包含Windows Phone 应用程序项目的解决方案 (如一个被Visual Studio创建的解决方案). 你可以查看 Windows Phone 代码,但是没法编译和部署在Xamarin Studio.
查看一个 Xamarin.Forms 应用程序
默认的模板创建一个最简单 Xamarin.Forms 应用程序. 如果你运行它,你会看到如下界面:
在上面的截图中,每个界面都是使用Xamarin Forms的Page 的效果. 一个Xamarin.Forms.Page
在Android中 就是Activity对象 ,在iOS中就是 View Controller对象, 在Windows Phone就是 Page 对象. 上面截图的HelloXamarinFormsWorld 例子是使用一个Xamarin.Forms.ContentPage
对象,然后展示一个标签.
为了最大化重用启动代码, Xamarin.Forms 应用程序会创建一个叫App的简单类,作用是实例化第一个展示的Page对象.下面的代码就是一个App类的例子:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
上述代码实例化一个ContentPage
对象,该对象会显示一个单行的 Label,并设置了在页面中水平和垂直居中
.
在各平台启动初始化 Xamarin.Forms Page
为了在应用程序中使用Xamarin Forms Page对象, 每个平台上的项目必须初始化 Xamarin.Forms 框架并在启动时提供一个实例化的ContentPage的对象. 不同平台上的启动代码是不一样的。
Android
在Android中启动初始化 Xamarin.Forms 页面, 你必须创建一个使用MainLauncher特性的Activity,就像之前的传统的Android应用一样; 除此以外你的activity 还必须继承至Xamarin.Forms.Platform.Android.AndroidActivity
,然后重写OnCreate方法,在其中进行 Xamarin.Forms framework的初始化,显示初始的Page等工作。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
上述代码会创建一个 Xamarin.Android 应用程序
iOS
在一个 Xamarin.iOS 应用程序中,需要在 AppDelegate 类中初始化 Xamarin.Forms 框架,然后设置RootViewController为初始的Xamarin.Forms Page. 如下面代码显示的,这些都要在 FinishedLaunching 方法中完成
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
和andoroid一样, FinishedLaunching事件的第一步是通过Xamarin.Forms.Forms.Init()初始化
Xamarin.Forms 框架。这样做原因是因为Xamarin.Forms需要在应用程序中全局加载. 下一步是设置应用程序的根view controller对象. 这需要调用在跨平台类库中创建的HelloWordPage对象的 CreateViewController()方法。
Windows Phone
在一个 Windows Phone项目中初始页会初始化Xamarin.Forms框架,然后用 Xamarin.Forms Page对象设置起始页内容. 下面代码是如何操作的一个例子:
1
2 3 4 5 6 7 8 9 10 |
|
既然我们已经开始对 Xamarin.Forms有些了解,然后我们开始更详细讨论Xamarin Forms.
Views and Layouts
Xamarin.Forms使用了一个很简单的API,通过Control对象和Layouts对象组合用于创建UI界面。 在运行时, Xamarin.Forms control会映射到相应的原生控件,并用原生控件来呈现.用于 Xamarin.Forms 应用的界面展示主要是如下4个类:
- View - 在其他平台通常会被称为controls 或 widgets. 就是相当于标签,按钮,文本框等等UI元素.
- Page - 一个Page在应用程序程序代表一个屏幕的内容. 他类似于Android的 Activity, Windows Phone 的Page, iOS 的View Controller.
- Layout - 一种View的子类. 作为放置界面显示的View对象和其他Layout的容器. Layout 通常包含如何组织呈现子view的逻辑.
- Cell - 这个类是专门的元素用于代表list或table中的项目,它描述了列表中每个元素是如何展示的.
下面是常用的Control:
Xamarin.Forms Control | Description |
Label |
只读显示文本 |
Entry |
单行输入文本框 |
Button |
按钮 |
Image |
用于展示图片的控件 |
ListView |
列表清单. |
Controls 本身是由 layout进行布局控制的. Xamarin.Forms 有两类不同的布局控制方式:
- Managed Layouts - layout负责内部的控件的位置和大小,并且遵循 CSS box model. 应用程序不会直接尝试去设置控件的大小和位置. 内置的一个Managed Layout的是 the
StackLayout
. - Unmanaged Layouts -和managed layouts相反, unmanaged layouts 不会自动调整屏幕中控件的位置. 通常用户在加入到layout时要自己指定好位置和大小。内置的
AbsoluteLayout
是一个 unmanaged layout .
让我们具体讨论下 StackLayout
和AbsoluteLayout
.
StackLayout
StackLayout
是最常见的managed layout. StackLayout
可以满足那些跨平台应用程序开发中希望无视屏幕尺寸,系统自动调整控件位置的需求。每个子元素按照加入layout的顺序依次被定位,无论横向还是竖向 . StackLayout
会使用多少空间,取决于HorizontalOptions
和LayoutOptions
属性的设置, 默认StackLayout
会使用整个屏幕区域
下列代码是使用 StackLayout
排列3个Label
控件:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
下列代码是使用XAML进行同样的布局:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
下面的截图我们可以看到默认 StackLayout 会垂直排列
可以通过下面的代码对 Orientation 和Vertical属性进行设置
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
下列代码是使用XAML进行同样的布局:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
修改后代码的运行截图如下
尽管不能显式地设置StackLayout内控件的大小
, 但是可以通过HeightRequest
和WidthRequest
属性告诉layout引擎控件具体的大小.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
下列代码是使用XAML进行同样的布局:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
修改后的程序运行结果:
Absolute Layout
AbsoluteLayout
属于 unmanaged layout. 在layout内的控件必须显式设置好自己的位置. 这个概念和老早的windows forms和ios平台(没有使用constarints)上控件定位的方法很像. 由于设置了具体精确的定位位置,我们需要在不同尺寸的屏幕上对layout进行测试来保证效果。
下面是使用 AbsoluteLayout
的简单例子:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
Conceptually
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
下面的截图就是最后呈现的结果
需要注意每个被加入Children集合对象的顺序影响了
屏幕上元素的Z-order – 第一个加入的在最底下 而随后加入的控件在他的上面, 会产生覆盖 (像例子中的绿色标签).所以绝对布局控件时要注意小心覆盖导致隐藏其他控件
Xamarin.Forms中的列表
ListViews
在移动应用程序是一个常见控件,所以我们可以详细讨论下. ListView
用于展示一个集合中的项目。在ListVIew中每个项目都是由一个cell组成.默认ListView会使用内置的 TextCell
来输出一个单行文本。下面的代码是使用ListView的简单例子:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
下面是运行的截图
和一个自定义类绑定
自定义的类也可以使用ListView来绑定显示. 我们定义以下类:
1
2 3 4 |
|
ListView
可以像下面这样使用:
1
2 3 4 5 6 7 |
|
为了控制在列表中显示的内容,需要创建一个binging,并设置绑定的属性 - 在这个例子中是 Name
属性.
1
2 |
|
在ListView中选择一个项目
在ListView中实现ItemSelected
事件可以响应界面上的点击事件,下面代码展示显示一个简单提示框:
1
2 3 |
|
在一个 NavigationPage中的话,可以使用
Navigation.PushAsync
方法打开一个新的Page进行导航. ItemSelected
事件中可以通过 e.SelectedItem访问选中的绑定对象
, 我们可以继续把对象绑定到新的Page然后通过 PushAsync方法展示
:
1
2 3 4 5 |
|
每个平台的导航方式不一样的.更多内容在 Navigation.
自定义一个Cell的样式
我们可以通过创建一个ViewCell的子类,并设置到ListView的ItemTemplate属性上来实现Cell样式的自定义
看一下下面的截图样式
这个cell由一个 Image
控件和两个Label控件组成
. 为了创建这个自定义的布局,我们需要创建一个 ViewCell
的子类:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|
代码中的内容很多
- 它加入一个
Image控件,然后绑定
ImageUri属性到
Employee
对象. - 它创建了
StackLayout包含垂直排列的两个标签
. 标签绑定Employee
对象的DisplayName
属性和Twitter
属性. - 它创建另一个
StackLayout
用于放置Image
和第二步创建的StackLayout
. 然后使用水平排列.
一旦自定义的 cell类创建好,我们可以使用在ListView中 DataTemplate对象
:
1
2 3 4 5 6 7 |
|
向 ListView传入一个Empolyee集合对象,每个
cell都会使用EmployeeCell类来呈现
. ListView
会把 Employee
对象通过BindingContext传入EmployeeCell
使用XAML来自定义一个列表
之前的代码可以通过如下XAML实现
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
数据绑定
Xamarin.Forms 应用程序使用数据绑定非常方便地显示和交互数据.它在用户界面和底层应用程序建立之间的连接. 当用户编辑文本框的内容时,数据绑定自动更新了所关联底层对象的属性 。 BindableObject
包含了很多内容用于实现数据绑定
数据绑定定义了两个对象间的关系. source 对象提供数据. target对象消费使用来自source数据 (通常是显示). 例如,一个Label
会显示Employee
对象.Employee
对象就是 source, Label
就是 target.
如何在 Xamarin.Forms 对象(如 Page 和 Control) 中使用数据绑定,需要遵循下面两步:
- 设置要绑定对象的 BindingContext 属性 ,用于绑定的源对象一般都要实现
INotifyPropertyChanged
接口. - Xamarin.Forms 的对象要调用SetBinding 方法进行绑定.
SetBinding
方法有两个参数. 第一个参数是绑定的类型信息. 第二个参数需要提供绑定什么内容和如何绑定的信息. 一般情况下可以设置为BindingContext中文本型的属性名, 如果我们直接要绑定, 我们可以这样写
1
|
|
点号告诉Xamarin.Forms直接使用 BindingContext
作为数据源,而不是 BindingContext的某个属性
. 一般在BindingContext
是一个简单类型,如string或integer.
为了帮助理解如何绑定一个对象到Page上,可以看看下面的截图
这个 Page使用了以下控件:
Xamarin.Forms.Image
Xamarin.Forms.Label
Xamarin.Forms.Entry
Xamarin.Forms.Button
Page对象通过构造子传入Employee对象.
1
2 3 4 5 6 7 8 9 10 11 12 |
|
代码第一行设置了 BindingContext为
一个.NET 对象 –这告诉底层界面需要绑定对象是谁. 下一行实例化了 Xamarin.Forms.Entry
控件. 最后一行绑定 Xamarin.Forms.Entry
和用于显示的employee对象
; Entry控件Text
属性被绑定到BindingContext对象的 FirstName
属性. Entry
控件的变化会自动更新到employeeToDisplay
对象. 同样, 如果 employeeToDisplay.FirstName的变化也会引起
Entry
控件的显示.绑定是双向的.
为了让双向绑定起作用, 模型类必须实现 INotifyPropertyChanged
接口.
INotifyPropertyChanged
INotifyPropertyChanged
接口用于当一个对象值发生变化时需要通过客户端的场景,接口很简单:
1
2 3 4 5 |
|
INotifyPropertyChanged的对象必须在他的属性值变化时触发
PropertyChanged
事件. 下面是一个简单的例子:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
当某个 MyObject实例的
FirstName
发生变化, OnPropertyChanged
会被调用来触发PropertyChanged
事件.
注意参数propertyName
使用了 CallMemberName
特性. 当OnPropertyChanged调用时参数为空
, CallMemberName
特性会调用OnPropertyChanged方法的方法名
.
Navigation
现在我们已经明白如何创建一个page并显示控件,接下来我们讨论下如何在page间导航跳转。. Navigation可以被看做一个后进先出,里面全是Page对象的栈. 在应用程序中从一个page跳到另一个page,只要在栈中压入一个新的page对象;返回到之前的page则只要在栈中弹出当前的Page。Xamarin.Forms 中的导航使用 INavigation
接口
1
2 3 4 5 6 7 8 |
|
这些方法都返回 Task对象,用于调用代码确保push和pop page是否成功
Xamarin.Forms 内置了 NavigationPage
对象,实现了上面的接口用于管理page. NavigationPage
类会屏幕上方在加入一个导航工具栏,上面会显示一个标题,还有与平台相应样式的返回按钮用于退回到前一个page。 下面的代码展示如何在第一个page中使用 NavigationPage
:
1
2 3 4 5 |
|
为了在当前page中显示LoginPage则需要调用 INavigation.PushAsync
方法
1
|
|
当新的LoginPage 对象被压入 Navigation 的栈中. 退回前一page, LoginPage 必须调用:
1
|
|
模态的导航也是类似的. :
1
|
|
返回到调用页的话, LoginPage必须使用:
1
|
|
欢迎加入群88684603 一起讨论学习
Xamarin.Forms 简介的更多相关文章
- 使用Xamarin.Forms平台开发移动应用指南
下载书:链接: http://pan.baidu.com/s/1c29H9KG 密码: 7esm 注:捣鼓虚拟机把Hyper-V关闭,后来Xamarin搞挂了,所以暂停翻译. 第1章 Xamarin. ...
- Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
Xamarin.Forms 是一个跨平台的.基于原生控件的UI工具包,开发人员可以轻松的创建适用于 Android,iOS 以及 Windows Phone的用户界面.Xamarin.Forms 通过 ...
- 张高兴的 Xamarin.Forms 开发笔记:为 Android 与 iOS 引入 UWP 风格的汉堡菜单 ( MasterDetailPage )
所谓 UWP 样式的汉堡菜单,我曾在"张高兴的 UWP 开发笔记:汉堡菜单进阶"里说过,也就是使用 Segoe MDL2 Assets 字体作为左侧 Icon,并且左侧使用填充颜色 ...
- 张高兴的 Xamarin.Forms 开发笔记:Android 快捷方式 Shortcut 应用
一.Shortcut 简介 Shortcut 是 Android 7.1 (API Level 25) 的新特性,类似于苹果的 3D Touch ,但并不是压力感应,只是一种长按菜单.Shortcut ...
- Xamarin.Forms跨平台开发入门-第二部分:深入解析
英文原文: https://developer.xamarin.com/guides/xamarin-forms/getting-started/hello-xamarin-forms/deepdiv ...
- Xamarin.Forms客户端第一版
Xamarin.Forms客户端第一版 作为TerminalMACS的一个子进程模块,目前完成第一版:读取展示手机基本信息.联系人信息.应用程序本地化. 功能简介 详细功能说明 关于TerminalM ...
- xamarin.forms新建项目android编译错误
vs2015 update3 新建的xamarin.forms项目中的android项目编译错误.提示缺少android_m2repository_r22.zip,96659D653BDE0FAEDB ...
- Xamarin.Forms 免费电子书
Xamarin Evolve 正在举行,现在已经放出2本免费的Xamarin.Forms 免费电子书,据现场的同学说这两天还有Xamarin.Forms 重磅消息发布: Creating Mobile ...
- 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选
在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...
随机推荐
- Windows Server 2012 虚拟化实战:SCVMM的安装和部署
本篇大概介绍一下在Windows Server 2012 R2上安装和部署SCVMM的过程及其注意事项.下图是我们数据中心SCVMM的基本架构,其中 SCVMM Database 是用于存储了所有配置 ...
- screen:多重视窗管理程序
screen:多重视窗管理程序 screen [-S SCREEN_NAME]: 创建窗口,可指定窗口名称,如果不指定,则是ID.$HOSTNAME screen -ls: 列出所有的screen窗口 ...
- 在IT择善培训机构的培训心得
人的一生中都是不断学习来提高 自己,俗话说:“知识是人类不断进步的阶梯”也是“飞向天空的翅膀”. 本人因工作的加入了择善进行学习,能成为择善的学员,不知不觉来到择善1个多月,回想起这1个多 ...
- css实现页面元素居中
水平居中 对于已知宽度的块级元素实现水平居中只需要设置 margin-left:auto; margin-right:auto; 对于多个块级元素实现水平居中只需要设置 //1 父类{ text-al ...
- Python中关于字符串的问题
在Python里面,字符串相加经常会出现'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)这样的 ...
- 项目自动化建构工具gradle 入门2——log4j输出helloWorld
上一章节呢,有一个能跑的程序了.但是对做工程的人来说,用日志输出感觉比用System.out要有档次一点.比如使用log4j.直接上例子: 1进入D:\work\gradle\log目录 ,您电脑没 ...
- XIB——AutoLayout添加约束
仿QQ登录界面: 说明:以下各图背景红色只是方便看清楚: 1.创建工程:创建xib文件,不会,可看上上上篇:初识xib: 2.打开xib文件: (1).创建头像: 拖控件:uiimageview--& ...
- JAVA设计模式之2-简单工厂模式
今天来介绍简单工厂模式,工厂模式包括简单工厂模式和抽象工厂模式,今天先讲简单工厂模式,然后引申到抽象工厂模式 在没有工厂模式前,我们创建类是直接new一个对象,比如下面所示,北汽有两个小型SUV,分别 ...
- Dapper学习笔记(一)
https://github.com/StackExchange/dapper-dot-net Dapper是对IDbConnection的扩展,需要使用Dapper提供的扩展只需要把SqlMappe ...
- linux的常用文件系统格式
文件系统指文件存在的物理空间.在Linux系统中,每个分区都是一个文件系统,都有自己的目录层次结构.Linux的最重要特征之一就是支持多种文件系统,这样它更加灵活,并可以和许多其它种操作系统共存.Vi ...