Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6658231
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Android平台

2017-10-25 21:56:14


Xamarin.Forms快速入门中,构建了Phoneword应用程序。 本文回顾了为了了解XAMarin.Forms应用程序的基础知识而建立的内容。

以下主题被提及:

  • Visual Studio简介 - Visual Studio简介,并创建一个新的Xamarin.Forms应用程序。
  • Xamarin.Forms应用程序的解剖学 - Xamarin.Forms应用程序的基本部分的游览。
  • 架构与应用基础知识 - 如何在每个平台上启动应用程序。
  • 用户界面(UI) - 在Xamarin.Forms中创建用户界面。
  • 在Phoneword中引入的其他概念 - Phoneword应用程序中使用的其他概念的简要说明。
  • 测试和部署 - 使用关于测试,部署,生成图稿等的建议来完成应用程序。

Visual Studio简介

Visual Studio是微软强大的IDE。 它具有完全集成的视觉设计师,一个包含重构工具的文本编辑器,汇编浏览器,源代码集成等。 本文重点介绍使用Xamarin插件的一些基本的Visual Studio功能。

Visual Studio将代码整合到解决方案和项目中。 解决方案是一个容纳一个或多个项目的容器。 项目可以是应用程序,支持库,测试应用程序等。 Phoneword应用程序包含一个包含六个项目的解决方案,如以下屏幕截图所示。

项目有:

  • Phoneword – 该项目是可移植类库(PCL)项目,其中包含所有共享代码和共享UI。
  • Phoneword.Droid – 该项目拥有Android特定代码,是Android应用程序的入门点。
  • Phoneword.iOS – 该项目拥有iOS专用代码,是iOS应用程序的入门点。
  • Phoneword.UWP – 该项目拥有通用Windows平台(UWP)特定代码,是UWP应用程序的入门点。
  • Phoneword.WinPhone – 该项目持有Windows Phone特定代码,是Windows Phone 8.0应用程序的入口点。
  • Phoneword.WinPhone81 – 该项目包含Windows Phone 8.1特定代码,是Windows Phone 8.1应用程序的入口点。

Xamarin.Forms应用的解剖学

以下截图显示Visual Studio中Phoneword PCL项目的内容:

该项目由两个文件夹组成:

  • 引用包含构建和运行应用程序所需的程序集。
  • Properties包含AssemblyInfo.cs,.NET程序集元数据文件。 填写此文件的一些基本信息是您的应用程序是一个很好的做法。要想了解这个文件的更多信息,可以查看MSDN中的类。

该项目还包括一些文件:

  • App.xamlApp类的XAML标记,用于定义应用程序的资源字典。
  • App.xaml.cs应用程序类的代码隐藏,负责实例化每个平台上的应用程序显示的第一个页面,以及处理应用程序生命周期事件。
  • IDialer.cs IDialer接口,它指定Dial方法必须由任何实现类提供。
  • MainPage.xamlMainPage类的XAML标记,用于定义应用程序启动时显示的页面的UI。
  • MainPage.xaml.csMainPage类的代码隐藏,它包含用户与页面交互时执行的业务逻辑。
  • packages.config一个XML文件,其中包含有关项目使用的NuGet包的信息,以便跟踪所需的包及其各自的版本。 Visual Studio for Mac和Visual Studio都可以配置为在与其他用户共享源代码时自动恢复任何缺少的NuGet软件包。此文件的内容由NuGet软件包管理器控制,不应手动编辑。
  • PhoneTranslator.cs负责将电话字转换为电话号码的业务逻辑,从MainPage.xaml.cs调用。

有关Xamarin.iOS应用程序的解剖结构的更多信息,请参阅Xamarin.iOS应用程序的解剖 有关Xamarin.Android应用程序的解剖结构的更多信息,请参阅Xamarin.Android应用程序的解剖

架构与应用基础

Xamarin.Forms应用程序的架构与传统的跨平台应用程序相同。 共享代码通常放在便携式类库(PCL)中,平台特定的应用程序使用共享代码。 下图显示了Phoneword应用程序的这种关系的概述:

有关PCL的更多信息,请参阅便携式类库简介

为了最大程度地重用启动代码,Xamarin.Forms应用程序有一个名为App的类,负责实例化每个平台上应用程序显示的第一页,如下面的代码示例所示:

点击(此处)折叠或打开

  1. using Xamarin.Forms;
  2. using Xamarin.Forms.Xaml;

  3. [assembly: XamlCompilation(XamlCompilationOptions.Compile)]
  4. namespace Phoneword
  5. {
  6.     public partial class App : Application
  7.     {
  8.         public App()
  9.         {
  10.             InitializeComponent();
  11.             MainPage = new MainPage();
  12.         }
  13.         ...
  14.     }
  15. }


该代码将App类的MainPage属性设置为MainPage类的新实例。 此外,XamlCompilation属性打开XAML编译器,使XAML直接编译成中间语言。 有关更多信息,请参阅XAML编译。

在每个平台上启动应用程序

iOS

要在iOS中启动最初的Xamarin.Forms页面,Phoneword.iOS项目包括继承自FormsApplicationDelegate类的AppDelegate类,如以下代码示例所示:

点击(此处)折叠或打开

  1. amespace Phoneword.iOS
  2. {
  3.     [Register ("AppDelegate")]
  4.     public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
  5.     {
  6.         public override bool FinishedLaunching (UIApplication app, NSDictionary options)
  7.         {
  8.             global::Xamarin.Forms.Forms.Init ();
  9.             LoadApplication (new App ());
  10.             return base.FinishedLaunching (app, options);
  11.         }
  12.     }
  13. }

FinishedLaunching override通过调用Init方法来初始化Xamarin.Forms框架。 这将导致在通过调用LoadApplication方法设置根视图控制器之前,将Xamarin.Forms的iOS特定实现加载到应用程序中。


Android

要在Android中启动Xamarin.Forms初始化页面,Phoneword.Droid项目包括使用MainLauncher属性创建活动的代码,活动继承自FormsApplicationActivity类,如以下代码示例所示:

点击(此处)折叠或打开

  1. namespace Phoneword.Droid
  2. {
  3.     [Activity (Label = "Phoneword.Droid",
  4.                Icon = "@drawable/icon",
  5.                MainLauncher = true,
  6.                ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
  7.     public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
  8.     {
  9.         protected override void OnCreate (Bundle bundle)
  10.         {
  11.             base.OnCreate (bundle);
  12.             global::Xamarin.Forms.Forms.Init (this, bundle);
  13.             LoadApplication (new App ());
  14.         }
  15.     }
  16. }
OnCreate覆盖通过调用Init方法来初始化Xamarin.Forms框架。 这将导致在加载Xamarin.Forms应用程序之前,将Xamarin.Forms的Android特定实现加载到应用程序中。


通用Windows平台

在通用Windows平台(UWP)应用程序中,从App类调用初始化Xamarin.Forms框架的Init方法:

点击(此处)折叠或打开

  1. Xamarin.Forms.Forms.Init (e);

  2. if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
  3. {
  4.   ...
  5. }

这导致将XAMarin.Forms的UWP特定实现加载到应用程序中。 最初的Xamarin.Forms页面由MainPage类启动,如下面的代码示例所示:

点击(此处)折叠或打开

  1. namespace Phoneword.UWP
  2. {
  3.     public sealed partial class MainPage
  4.     {
  5.         public MainPage()
  6.         {
  7.             this.InitializeComponent();
  8.             this.LoadApplication(new Phoneword.App());
  9.         }
  10.     }
  11. }


Xamarin.Forms应用程序加载了LoadApplication方法。

用户界面

用于创建Xamarin.Forms应用程序的用户界面的四个主要控制组。

  1. PagesXamarin.Forms页面代表跨平台移动应用程序屏幕。 Phoneword应用程序使用ContentPage类显示单个屏幕。有关页面的更多信息,请参阅Xamarin.Forms页面。
  2. LayoutsXamarin.Forms布局是用于将视图组合成逻辑结构的容器。 Phoneword应用程序使用StackLayout类在水平堆栈中排列控件。有关布局的更多信息,请参阅Xamarin.Forms布局。
  3. Views Xamarin.Forms视图是用户界面上显示的控件,如标签,按钮和文本输入框。 Phoneword应用程序使用Label,Entry和Button控件。有关视图的更多信息,请参阅Xamarin.Forms视图。
  4. Cells Xamarin.Forms单元格是用于列表中的项目的专用元素,并描述应如何绘制列表中的每个项目。 Phoneword应用程序不会使用任何单元格。有关细胞的更多信息,请参阅Xamarin.Forms Cells

在运行时,每个控件都将被映射到其本机的等价物,这将被渲染。

当Phoneword应用程序在任何平台上运行时,它将显示与Xamarin.Forms中的页面相对应的单个屏幕。 A页面表示Android中的ViewGroup,iOS中的View Controller,或通用Windows平台上的页面。 Phoneword应用程序还实例化一个ContentPage对象,该对象表示MainPage类,其XAML标记显示在以下代码示例中:

点击(此处)折叠或打开

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ContentPage xmlns=""
  3.                          xmlns:x=""
  4.                          x:Class="Phoneword.MainPage">
  5.         ...
  6.         <StackLayout>
  7.             <Label Text="Enter a Phoneword:" />
  8.             <Entry x:Name="phoneNumberText" Text="1-855-XAMARIN" />
  9.             <Button x:Name="translateButon" Text="Translate" Clicked="OnTranslate" />
  10.             <Button x:Name="callButton" Text="Call" IsEnabled="false" Clicked="OnCall" />
  11.         </StackLayout>
  12. </ContentPage>

MainPage类使用StackLayout控件自动排列屏幕上的控件,无论屏幕大小如何。 每个子元素按照它们被添加的顺序垂直放置。 StackLayout控件包含一个Label控件来显示页面上的文本,一个Entry控件来接受文本用户输入,另外两个Button控件用于执行代码以响应触摸事件。


有关Xamarin.Forms中的XAML的更多信息,请参阅Xamarin.Forms XAML基础知识。

响应用户交互

XAML中定义的对象可以触发在代码隐藏文件中处理的事件。 以下代码示例显示MainPage类的代码隐藏中的OnTranslate方法,该方法是在“Translate”按钮上触发Clicked事件时执行的。

点击(此处)折叠或打开

  1. void OnTranslate(object sender, EventArgs e)
  2. {
  3.     translatedNumber = Core.PhonewordTranslator.ToNumber (phoneNumberText.Text);
  4.     if (!string.IsNullOrWhiteSpace (translatedNumber)) {
  5.         callButton.IsEnabled = true;
  6.         callButton.Text = "Call " + translatedNumber;
  7.     } else {
  8.         callButton.IsEnabled = false;
  9.         callButton.Text = "Call";
  10.     }
  11. }

OnTranslate方法将phoneword转换为相应的电话号码,作为响应,在通话按钮上设置属性。 XAML类的代码隐藏文件可以使用分配给它的名称使用x:Name属性访问XAML中定义的对象。 分配给此属性的值与C#变量具有相同的规则,因为它必须以字母或下划线开头,并且不包含嵌入空格。


翻译按钮到OnTranslate方法的接线发生在MainPage类的XAML标记中:

点击(此处)折叠或打开

  1. <Button x:Name="translateButon" Text="Translate" Clicked="OnTranslate" />




点击(此处)折叠或打开

  1. <Button x:Name="translateButon" Text="Translate" Clicked="OnTranslate" />
在Phoneword推出的其他概念

对于Xamarin.Forms的Phoneword应用程序介绍了本文未介绍的几个概念。 这些概念包括:

  • 启用和禁用按钮。 可以通过更改其IsEnabled属性来打开或关闭按钮。 例如,以下代码示例禁用callButton:

    点击(此处)折叠或打开

    1. callButton.IsEnabled = false;



  • 显示警报对话框。 当用户按下呼叫按钮时,Phoneword应用程序会显示一个警报对话框,并提供放置或取消呼叫的选项。 DisplayAlert方法用于创建对话框,如下面的代码示例所示:

    点击(此处)折叠或打开

    1. await this.DisplayAlert (
    2.         "Dial a Number",
    3.         "Would you like to call " + translatedNumber + "?",
    4.         "Yes",
    5.         "No");



  • 通过DependencyService类访问本机特性。 Phoneword应用程序使用DependencyService类将IDialer接口解析为平台特定的电话拨号实现,如Phoneword项目的以下代码示例所示:

    点击(此处)折叠或打开

    1. async void OnCall (object sender, EventArgs e)
    2. {
    3.     ...
    4.     var dialer = DependencyService.Get<IDialer> ();
    5.     ...
    6. }



    有关DependencyService类的更多信息,请参阅通过DependencyService访问本机特性。

  • 使用网址拨打电话。 Phoneword应用程序使用OpenURL启动系统电话应用程序。 该URL包含一个tel:前缀,后跟要调用的电话号码,如以下iOS项目代码示例所示:

    点击(此处)折叠或打开

    1. return UIApplication.SharedApplication.OpenUrl (new NSUrl ("tel:" + number));



  • 调整平台布局。 Device类使开发人员能够在每个平台的基础上自定义应用程序布局和功能,如以下代码示例所示,在不同平台上使用不同的Padding值来正确显示每个页面:

    点击(此处)折叠或打开

    1. <ContentPage xmlns=""
    2.              ...>
    3.     <ContentPage.Padding>
    4.         <OnPlatform x:TypeArguments="Thickness">
    5.             <On Platform="iOS" Value="20, 40, 20, 20" />
    6.             <On Platform="Android, WinPhone, Windows" Value="20" />
    7.         </OnPlatform>
    8.     </ContentPage.Padding>
    9.     ...
    10. </ContentPage>

    有关平台调整的更多信息,请参阅设备类。


测试和部署

Visual Studio for Mac和Visual Studio都提供了许多用于测试和部署应用程序的选项。 调试应用程序是应用程序开发生命周期的常见部分,有助于诊断代码问题。 有关详细信息,请参阅设置断点,逐步代码和输出信息到日志窗口。

模拟器是开始部署和测试应用程序的好地方,并且具有用于测试应用程序的有用功能。 然而,用户不会在模拟器中使用最终的应用程序,所以应该在早期和经常在实际设备上进行测试。 有关iOS设备配置的详细信息,请参阅设备配置。 有关Android设备配置的更多信息,请参阅设置开发设备。

概要

本文使用Xamarin.Forms来研究应用程序开发的基础知识。 涵盖的主题包括Xamarin.Forms应用程序,架构和应用程序基础知识以及用户界面的解剖。

在本指南的下一部分中,应用程序将扩展到包含多个屏幕,以便探索更高级的Xamarin.Forms体系结构和概念。

阅读(1160) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~