《 C#7和.NET Core》一书。 面向专业人员的跨平台开发。 第三版

图片 大家好,我们已经撰写了Mark Price的新书,现在我们摘录摘自《使用Xamarin.Forms开发移动应用程序》一书的摘录。

我们将在Northwind数据库中创建一个移动客户端列表管理应用程序,该应用程序可以在iOS或Android上运行。

安装Android SDK


要创建Android应用程序,您必须至少安装一个Android SDK。 默认情况下,安装Visual Studio for Mac已包含一个Android SDK,但通常是较旧的版本,以支持最多数量的Android设备。 要使用Xamarin.Forms的最新功能,您需要安装更新版本的Android SDK。

启动Visual Studio for Mac,然后运行命令Visual Studio社区->首选项(Visual Studio社区->首选项)。

在“首选项”对话框中,转到“项目”→“ SDK位置”部分,然后选择所需的平台,例如Android 8.0-Oreo(图18.1)。
图片

创建一个Xamarin.Forms解决方案


运行命令文件→新建解决方案。

在打开的对话框中,在“多平台”类别中选择“应用程序”项(跨平台项目)。 在Xamarin.Forms部分中,选择Blank Forms App(图18.2)。

图片

单击下一步按钮。

在“应用程序名称”字段中,输入NorthwindMobile,在“组织标识符”字段中,输入com.packt。 将Shared Code开关设置为Use Shared Library位置,并激活Use XAML for the user interface files复选框(图18.3)。

单击下一步按钮。

在“解决方案名称”字段中,指定Part3Mobile值,在“位置”字段中,指定值/ Users / your_name / Code(图18.4)。 单击创建按钮。 稍后,将创建一个解决方案和三个项目。 在Visual Studio for Mac中,运行命令Build→Build All(组装→Build All),然后等待程序下载所有更新的程序包并收集项目(图18.5)。

右键单击Part3Mobile,然后选择“更新NuGet软件包”。

图片

图片

图片

模型制作


我们可以使用先前通过.NET Standard 2.0实体创建的数据模型库,但是我们需要实现双向数据绑定,因此我们将创建一个新类来表示移动应用程序中的客户端实体。

右键单击NorthwindMobile项目,在上下文菜单中,单击添加→新建文件夹,然后将创建的目录命名为Models。

右键单击“模型”目录,然后在快捷菜单上,单击“添加”→“新建文件”。

在“新建文件”对话框中,执行命令“常规”→“空类”(“常规”→“空类”),将类命名为“客户”(图18.6),然后单击“新建”按钮。

修改指令,如下清单所示:

using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; namespace NorthwindMobile.Models { public class Customer : INotifyPropertyChanged { 


图片


 public static IList<Customer> Customers; static Customer() { Customers = new ObservableCollection<Customer>(); } public event PropertyChangedEventHandler PropertyChanged; private string customerID; private string companyName; private string contactName; private string city; private string country; private string phone; public string CustomerID { get { return customerID; } set   { customerID = value;  PropertyChanged?.Invoke(this,  new PropertyChangedEventArgs("CustomerID"));  } } public string CompanyName { get { return companyName; } set  {  companyName = value; PropertyChanged?.Invoke(this,  new PropertyChangedEventArgs("CompanyName")); } } public string ContactName { get { return contactName; } set { contactName = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ContactName"));  } } public string City { get { return city; } set { city = value;   PropertyChanged?.Invoke(this,   new PropertyChangedEventArgs("City"));    }    }    public string Country { get { return country; } set { country = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Country")); } } public string Phone { get { return phone; } set { phone = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Phone")); } }  public string Location { get { return string.Format("{0}, {1}", City, Country); } } //     - public static void SampleData() {   Customers.Clear(); Customers.Add(new Customer { CustomerID = "ALFKI", CompanyName = "Alfreds Futterkiste",  ContactName = "Maria Anders", City = "Berlin", Country = "Germany", Phone = "030-0074321" }); Customers.Add(new Customer { CustomerID = "FRANK",  CompanyName = "Frankenversand",    ContactName = "Peter Franken",   City = "München", Country = "Germany", Phone = "089-0877310"  }); Customers.Add(new Customer  {  CustomerID = "SEVES", CompanyName = "Seven Seas Imports", ContactName = "Hari Kumar", City = "London", Country = "UK", Phone = "(171) 555-1717" });    }  } } 

请注意以下几点。

  • 该类实现INotifyPropertyChanged,因此双向用户界面组件(例如Editor)将更新属性,反之亦然。 一切都取决于PropertyChanged事件,该事件在属性之一更改时发生。
  • 从服务下载后,将使用ObservableCollection将客户数据本地缓存在移动应用程序中。 这为所有相关的用户界面组件(如ListView)提供了通知支持。
  • 除了用于存储从REST服务检索的值的属性外,该类还定义了只读位置属性。 它将作为客户合并列表中的绑定。
  • 出于测试目的,当REST服务不可用时,将使用一种方法来使用三个演示客户端的数据。

创建用于拨打电话号码的界面


右键单击NorthwindMobile目录,然后从上下文菜单中选择添加→新建文件。

在“新建文件”对话框中,选择“常规”→“空接口”,命名接口IDialer,然后单击“新建”。
更改IDialer接口代码,如以下清单所示:

 namespace NorthwindMobile { public interface IDialer { bool Dial(string number); } } 

实施用于拨打iOS电话号码的界面


右键单击NorthwindMobile.iOS目录,然后从上下文菜单中单击添加→新建文件。

在“新建文件”对话框中,选择“常规”→“空类”(“常规”→“空类”),为该类命名为PhoneDialer,然后单击“新建”按钮。

更改其内容,如下面的清单所示:

 using Foundation; using NorthwindMobile.iOS; using UIKit; using Xamarin.Forms; [assembly: Dependency(typeof(PhoneDialer))] namespace NorthwindMobile.iOS {  public class PhoneDialer : IDialer {    public bool Dial(string number) { return UIApplication.SharedApplication.OpenUrl( new NSUrl("tel:" + number));  }  } } 

实现用于拨打Android电话号码的界面


右键单击上下文菜单中的NorthwindMobile.Droid目录,然后执行命令添加->新建文件。

在“新建文件”对话框中,运行命令常规->空类(常规->空类),将类命名为PhoneDialer,然后单击“新建”按钮。

修改其内容,如以下清单所示:

 using Android.Content; using Android.Telephony; using NorthwindMobile.Droid; using System.Linq; using Xamarin.Forms; using Uri = Android.Net.Uri; [assembly: Dependency(typeof(PhoneDialer))] namespace NorthwindMobile.Droid { public class PhoneDialer : IDialer { public bool Dial(string number) { var context = Forms.Context; if (context == null) return false; var intent = new Intent(Intent.ActionCall); intent.SetData(Uri.Parse("tel:" + number)); if (IsIntentAvailable(context, intent))  {  context.StartActivity(intent); return true; } return false; } public static bool IsIntentAvailable(Context context, Intent intent) { var packageManager = context.PackageManager; var list = packageManager.QueryIntentServices(intent, 0) .Union(packageManager.QueryIntentActivities(intent, 0)); if (list.Any()) return true; var manager = TelephonyManager.FromContext(context); return manager.PhoneType != PhoneType.None; } } } 

在NorthwindMobile.Droid目录中,展开Properties子目录,然后打开AndroidManifest.xml文件。 在“必需的权限”区域中,选中“ CallPhone”复选框(图18.7)。

图片

关于作者


Mark J. Price是Microsoft认证解决方案开发人员(MCSD),Microsoft专家:C#编程和Episerver认证开发人员,具有20多年的培训和编程经验。

自1993年以来,Mark已经通过了80多次Microsoft编程考试,并且专门为其他人进行成功的测试做准备。 他的学生既16岁,又是具有多年经验的专业人员。 Mark为全球公司提供有效的培训,将教育活动与咨询和系统设计方面的实际实践相结合。

在2001年至2003年之间,Mark投入了所有时间在美国雷蒙德市微软总部开发官方培训软件。 作为团队的一部分,当只发布Alpha版语言时,他用C#编写了第一门培训课程。 在与Microsoft合作期间,他在C#和.NET的特殊培训课程中担任认证公司的继续教育讲师。

Mark当前正在为Episerver的Digital Experience Cloud开发和支持培训课程,Episerver的Digital Experience Cloud是数字营销和电子商务中最好的.NET CMS。

2010年,马克获得了研究生课程的结业证书,该证书具有授课权。 他在伦敦的两所中学教伦敦的中学数学,为GCSE和A-Level证书做准备。 此外,Mark还获得了计算机科学BSc认证。 荣誉 在英国布里斯托大学获得学位。

关于审稿人


Dustin Heffron是软件和游戏开发人员。 他在各种语言方面拥有十多年的编程经验,其中八种与C#和.NET有关。

目前正在Becton Dickinson开发用于医疗器械自动化和测试的软件。 他还是SunFlake Studios的联合创始人兼首席执行官。

Dustin与Packt长期合作,并为诸如XNA 4.0游戏开发示例:初学者指南,C#6和.NET Core 1.0:现代跨平台开发,以及XNA 3D编程视频教程系列做出了贡献。通过示例。 此外,达斯汀(Dustin)与拉里·路易斯安那(Larry Louisiana)(拉里·路易斯安那)共同撰写了一系列视频教程XNA 3D Toolkit。

Efraim Kyriakidis是一位软件工程师,在为各种客户和项目开发和实施软件解决方案方面拥有十多年的经验。 他精通软件开发周期的所有阶段。 他在20世纪80年代对Commodore 64计算机的普及期间,第一次接触计算机和编程。 从那以后,他长大并获得希腊塞萨洛尼基亚里斯多德大学的文凭。 在整个职业生涯中,他主要使用Microsoft技术,从1.0版开始使用C#和.NET。 他目前在德国Siemens AG担任软件开发人员。

»这本书的更多信息可以在出版商的网站上找到
» 目录
» 摘录

小贩优惠券20%折扣-Packt

Source: https://habr.com/ru/post/zh-CN415275/


All Articles