Xamarin.Forms快速入门

简介: 本演练演示如何创建将用户输入的字母数字电话号码转换为数字电话号码的应用程序,并调用该号码。 最终的应用如下所示: 创建Phoneword应用程序如下: 在“开始”屏幕中,启动Visual Studio。

本演练演示如何创建将用户输入的字母数字电话号码转换为数字电话号码的应用程序,并调用该号码。 最终的应用如下所示:

创建Phoneword应用程序如下:

  1. 在“开始”屏幕中,启动Visual Studio。 这将打开起始页:

  2. 在Visual Studio中,单击创建新项目...以创建新项目:

  3. 在“新建项目”对话框中,单击“跨平台”,选择“跨平台应用程序(Xamarin.Forms或Native)”模板,将名称和解决方案名称设置为Phoneword,为项目选择合适的位置,然后单击确定按钮:

  4. 在“新跨平台应用程序”对话框中,单击空白应用程序,选择Xamarin.Forms作为UI技术,选择便携式类库(PCL)作为代码共享策略,然后单击确定按钮:

  5. 新的通用Windows项目对话框中,选择通用Windows平台(UWP)应用程序将支持的目标和最低版本的Windows 10:

  6. 解决方案资源管理器中,右键单击Phoneword解决方案,然后选择Manage NuGet Packages for Solution ...:

  7. 在“管理软件包解决方案”对话框中,选择更新选项卡,选择Xamarin.Forms软件包,并将软件包更新为最新的稳定版本:

  8. 解决方案资源管理器中,在Phoneword项目中,双击MainPage.xaml打开它:

  9. MainPage.xaml中,删除所有的模板代码,并将其替换为以下代码。 该代码声明性地定义了页面的用户界面:

    点击(此处)折叠或打开

    1. ?xml version="1.0" encoding="UTF-8"?>
    2. ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
    3.                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    4.                    x:Class="Phoneword.MainPage">
    5.     ContentPage.Padding>
    6.         OnPlatform x:TypeArguments="Thickness">
    7.             On Platform="iOS" Value="20, 40, 20, 20" />
    8.             On Platform="Android, WinPhone, Windows" Value="20" />
    9.         /OnPlatform>
    10.     /ContentPage.Padding>
    11.     StackLayout>
    12.       Label Text="Enter a Phoneword:" />
    13.       Entry x:Name="phoneNumberText" Text="1-855-XAMARIN" />
    14.       Button x:Name="translateButon" Text="Translate" Clicked="OnTranslate" />
    15.       Button x:Name="callButton" Text="Call" IsEnabled="false" Clicked="OnCall" />
    16.     /StackLayout>
    17. /ContentPage>


    通过按CTRL+S将更改保存到MainPage.xaml,然后关闭文件。
  10. 解决方案资源管理器中,展开MainPage.xaml并双击MainPage.xaml.cs将其打开:

  11. MainPage.xaml.cs中,删除所有模板代码,并将其替换为以下代码。 OnTranslate和OnCall方法将分别在用户界面中单击TranslateCall按钮时执行:

    点击(此处)折叠或打开

    1. using System;
    2. using Xamarin.Forms;

    3. namespace Phoneword
    4. {
    5.     public partial class MainPage : ContentPage
    6.     {
    7.         string translatedNumber;

    8.         public MainPage ()
    9.         {
    10.             InitializeComponent ();
    11.         }

    12.         void OnTranslate (object sender, EventArgs e)
    13.         {
    14.             translatedNumber = Core.PhonewordTranslator.ToNumber (phoneNumberText.Text);
    15.             if (!string.IsNullOrWhiteSpace (translatedNumber)) {
    16.                 callButton.IsEnabled = true;
    17.                 callButton.Text = "Call " + translatedNumber;
    18.             } else {
    19.                 callButton.IsEnabled = false;
    20.                 callButton.Text = "Call";
    21.             }
    22.         }

    23.         async void OnCall (object sender, EventArgs e)
    24.         {
    25.             if (await this.DisplayAlert (
    26.                     "Dial a Number",
    27.                     "Would you like to call " + translatedNumber + "?",
    28.                     "Yes",
    29.                     "No")) {
    30.                 var dialer = DependencyService.GetIDialer> ();
    31.                 if (dialer != null)
    32.                     dialer.Dial (translatedNumber);
    33.             }
    34.         }
    35.     }
    36. }


    注意:此时尝试构建应用程序将导致稍后修复的错误。

    通过按CTRL+S将更改保存到MainPage.xaml.cs,然后关闭文件。

  12. 解决方案资源管理器中,展开App.xaml并双击App.xaml.cs打开它:

  13. App.xaml.cs中,删除所有的模板代码,并将其替换为以下代码。 App构造函数只需将MainPage类设置为应用程序启动时将显示的页面:

    点击(此处)折叠或打开

    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.         protected override void OnStart()
    14.         {
    15.             // Handle when your app starts
    16.         }

    17.         protected override void OnSleep()
    18.         {
    19.             // Handle when your app sleeps
    20.         }

    21.         protected override void OnResume()
    22.         {
    23.             // Handle when your app resumes
    24.         }
    25.     }
    26. }

    通过按CTRL+S将更改保存到App.xaml.cs,并关闭文件。


  14. 解决方案资源管理器中,右键单击Phoneword项目,然后选择添加>新建项目...

  15. 添加新项目对话框中,选择Visual C#>代码>类,命名新文件PhoneTranslator,然后单击添加按钮:

  16. PhoneTranslator.cs中,删除所有的模板代码,并将其替换为以下代码。 这段代码将把手机字词翻译成电话号码:

    点击(此处)折叠或打开

    1. using System.Text;

    2. namespace Core
    3. {
    4.     public static class PhonewordTranslator
    5.     {
    6.         public static string ToNumber(string raw)
    7.         {
    8.             if (string.IsNullOrWhiteSpace(raw))
    9.                 return null;

    10.             raw = raw.ToUpperInvariant();

    11.             var newNumber = new StringBuilder();
    12.             foreach (var c in raw)
    13.             {
    14.                 if (" -0123456789".Contains(c))
    15.                     newNumber.Append(c);
    16.                 else
    17.                 {
    18.                     var result = TranslateToNumber(c);
    19.                     if (result != null)
    20.                         newNumber.Append(result);
    21.                     // Bad character?
    22.                     else
    23.                         return null;
    24.                 }
    25.             }
    26.             return newNumber.ToString();
    27.         }

    28.         static bool Contains(this string keyString, char c)
    29.         {
    30.             return keyString.IndexOf(c) >= 0;
    31.         }

    32.         static readonly string[] digits = {
    33.             "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"
    34.         };

    35.         static int? TranslateToNumber(char c)
    36.         {
    37.             for (int i = 0; i digits.Length; i++)
    38.             {
    39.                 if (digits[i].Contains(c))
    40.                     return 2 + i;
    41.             }
    42.             return null;
    43.         }
    44.     }
    45. }


    通过按CTRL+S将更改保存到PhoneTranslator.cs,并关闭文件。
  17. In Solution Explorer, right click on the Phoneword project and select Add > New Item...:解决方案资源管理器中,右键单击Phoneword项目,然后选择添加>新建项...:

  18. In the Add New Item dialog, select Visual C# > Code > Interface, name the new file IDialer, and click the Add button:添加新项目对话框中,选择Visual C#>代码>接口,命名新文件IDialer,然后单击添加按钮:

  19. IDialer.cs,中,删除所有的模板代码,并将其替换为以下代码。 该代码定义了一个拨号方式,必须在每个平台上实现拨号翻译的电话号码:

    点击(此处)折叠或打开

    1. namespace Phoneword
    2. {
    3.     public interface IDialer
    4.     {
    5.         bool Dial(string number);
    6.     }
    7. }

    通过按CTRL+S将更改保存到IDialer.cs,并关闭文件。


    该应用程序的通用代码现已完成。 平台专用电话拨号器代码现在将作为DependencyService实现。

  20. 解决方案资源管理器中,右键单击Phoneword.iOS项目,然后选择添加>新建项...:

  21. 在“添加新项目”对话框中,选择“Apple”>“代码”>“类”,为新的文件名称指定PhoneDialer,然后单击“添加”按钮:

  22. PhoneDialer.cs中,删除所有的模板代码,并将其替换为以下代码。 此代码创建将在iOS平台上使用的拨号方式拨打已翻译的电话号码:

    点击(此处)折叠或打开

    1. using Foundation;
    2. using Phoneword.iOS;
    3. using UIKit;
    4. using Xamarin.Forms;

    5. [assembly: Dependency(typeof(PhoneDialer))]
    6. namespace Phoneword.iOS
    7. {
    8.     public class PhoneDialer : IDialer
    9.     {
    10.         public bool Dial(string number)
    11.         {
    12.             return UIApplication.SharedApplication.OpenUrl (
    13.                 new NSUrl ("tel:" + number));
    14.         }
    15.     }
    16. }


    通过按CTRL+S将更改保存到PhoneDialer.cs,并关闭文件。
  23. 解决方案资源管理器中,右键单击Phoneword.Android项目,然后选择添加>新建项目...:

  24. 在添加新项目对话框中,选择Visual C#> Android>类,命名新的文件PhoneDialer,然后单击添加按钮:

  25. PhoneDialer.cs中,删除所有的模板代码,并将其替换为以下代码。 此代码创建将在Android平台上使用的拨号方式拨打已翻译的电话号码:

    点击(此处)折叠或打开

    1. using Android.Content;
    2. using Android.Telephony;
    3. using Phoneword.Droid;
    4. using System.Linq;
    5. using Xamarin.Forms;
    6. using Uri = Android.Net.Uri;

    7. [assembly: Dependency(typeof(PhoneDialer))]
    8. namespace Phoneword.Droid
    9. {
    10.     public class PhoneDialer : IDialer
    11.     {
    12.         public bool Dial(string number)
    13.         {
    14.             var context = Forms.Context;
    15.             if (context == null)
    16.                 return false;

    17.             var intent = new Intent (Intent.ActionCall);
    18.             intent.SetData (Uri.Parse ("tel:" + number));

    19.             if (IsIntentAvailable (context, intent)) {
    20.                 context.StartActivity (intent);
    21.                 return true;
    22.             }

    23.             return false;
    24.         }

    25.         public static bool IsIntentAvailable(Context context, Intent intent)
    26.         {
    27.             var packageManager = context.PackageManager;

    28.             var list = packageManager.QueryIntentServices (intent, 0)
    29.                 .Union (packageManager.QueryIntentActivities (intent, 0));

    30.             if (list.Any ())
    31.                 return true;

    32.             var manager = TelephonyManager.FromContext (context);
    33.             return manager.PhoneType != PhoneType.None;
    34.         }
    35.     }
    36. }


    通过按CTRL+S将更改保存到PhoneDialer.cs,并关闭文件。
  26. 解决方案资源管理器中,在Phoneword.Android项目中,双击属性并选择Android Manifest选项卡:

  27. 必需的权限部分,启用CALL_PHONE权限。 这给予应用程序许可拨打电话:

    通过按CTRL+S将更改保存到清单,并关闭文件。

  28. 解决方案资源管理器中,右键单击Phoneword.UWP项目,然后选择添加>新建项目...

  29. 在“添加新项目”对话框中,选择“Visual C#>代码”>“类”,命名新文件PhoneDialer,然后单击“添加”按钮:

  30. PhoneDialer.cs中,删除所有的模板代码,并将其替换为以下代码。 此代码创建将在通用Windows平台上使用的Dial方法和帮助方法来拨打已翻译的电话号码:

    点击(此处)折叠或打开

    1. using Phoneword.UWP;
    2. using System;
    3. using System.Threading.Tasks;
    4. using Windows.ApplicationModel.Calls;
    5. using Windows.UI.Popups;
    6. using Xamarin.Forms;

    7. [assembly: Dependency(typeof(PhoneDialer))]
    8. namespace Phoneword.UWP
    9. {
    10.     public class PhoneDialer : IDialer
    11.     {
    12.         bool dialled = false;

    13.         public bool Dial(string number)
    14.         {
    15.             DialNumber(number);
    16.             return dialled;
    17.         }

    18.         async Task DialNumber(string number)
    19.         {
    20.             var phoneLine = await GetDefaultPhoneLineAsync();
    21.             if (phoneLine != null)
    22.             {
    23.                 phoneLine.Dial(number, number);
    24.                 dialled = true;
    25.             }
    26.             else
    27.             {
    28.                 var dialog = new MessageDialog("No line found to place the call");
    29.                 await dialog.ShowAsync();
    30.                 dialled = false;
    31.             }
    32.         }

    33.         async TaskPhoneLine> GetDefaultPhoneLineAsync()
    34.         {
    35.             var phoneCallStore = await PhoneCallManager.RequestStoreAsync();
    36.             var lineId = await phoneCallStore.GetDefaultLineAsync();
    37.             return await PhoneLine.FromIdAsync(lineId);
    38.         }
    39.     }
    40. }


    通过按CTRL+S,将更改保存到PhoneDialer.cs,并关闭文件。
  31. In Solution Explorer, in the Phoneword.UWP project, right-click References, and select Add Reference...:解决方案资源管理器中,在Phoneword.UWP项目中,右键单击引用,然后选择添加引用...:

  32. 在“参考管理器”对话框中,选择“通用Windows>扩展> Windows Mobile Extensions for UWP”,然后单击“确定”按钮:

  33. 解决方案资源管理器中,在Phoneword.UWP项目中,双击Package.appxmanifest

  34. 在“功能”页面中,启用电话呼叫功能。 这给予应用程序许可拨打电话:

    通过按CTRL+S将更改保存到清单,并关闭文件。

  35. 在Visual Studio中,选择Build> Build Solution菜单项(或按CTRL + SHIFT + B)。 该应用程序将构建,一个成功的消息将出现在Visual Studio状态栏中:

    如果有错误,请重复上述步骤并纠正任何错误,直到应用程序构建成功。

  36. 解决方案资源管理器中,右键单击Phoneword.UWP项目,然后选择设置为启动项目

  37. 在Visual Studio工具栏中,按开始按钮(类似于播放按钮的三角形按钮)启动应用程序:

  38. 解决方案资源管理器中,右键单击Phoneword.Android项目,然后选择设置为启动项目

  39. 在Visual Studio工具栏中,按开始按钮(类似于播放按钮的三角形按钮)在Android模拟器中启动应用程序。
  40. 如果您有iOS设备并满足Xamarin.Forms开发的Mac系统要求,请使用类似的技术将应用程序部署到iOS设备。 注意:所有模拟器都不支持电话。

祝贺您完成Xamarin.Forms应用程序。 本指南中的下一个主题将回顾本演练中采取的步骤,以了解使用Xamarin.Forms的应用程序开发的基础知识。

目录
相关文章
|
iOS开发
Xamarin.Forms多画面快速入门
该快速入门演示了如何通过添加第二个屏幕来扩展Phoneword应用程序来跟踪应用程序的通话记录。 最终的应用如下所示: 扩展Phoneword应用程序如下: 在“开始”屏幕中,启动Visual Studio。
982 0
|
Android开发
Xamarin.Android快速入门
原文:Xamarin.Android快速入门 一、准备工作 1.创建一个空的解决方案,并命名为Phoneword     2.右击解决方案 新建-》新建项目 并命名为Phoneword_Droid   二、界面 1.
1078 0
|
开发工具 Android开发 iOS开发
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
使用vs2019学习xamarin时,创建新程序。使用模拟器真机等测试都报错如下图错误: ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231030-de8ce5fd.png?x-cos-security-token=r4KyZDEowPT0kGTL0LqE8EnwfN1Nzexadb05dcffed3939ff8d7591c528c01706nvpGSE93QwHpZM8NwhJNTZctNRQa0l3KDhEnqj8P7d8t
118 0
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
|
Java C# Android开发
.NET(WinCE、WM)开发转Android开发 ——Xamarin和Smobiler对比
WinCE从1995年诞生至今,已有20多年的发展历史,行业成熟方案覆盖范围广,从车载、工控、手持机都有涉及,且方案成熟。 近些年,Android以后来居上的态势,逐渐渗透至各行业领域,硬件手持大厂也把产品线重心向Android手持迁移,基于Android的行业解决方案越来越成熟,WinCE的开发人才流失,在WinCE解决方案上吃老本的企业寻求转型。
|
Web App开发 测试技术 Android开发
xamarin开发android收集的一些工具
原文:xamarin开发android收集的一些工具 xamarin开发android收集的一些工具 工欲善其事,必先利其器,从16年下半年开始做xamarin相关的开发,平时使用的一些工具和google插件给大家分享一下,都有下载地址,持续更新。
1535 0
|
存储 数据库 Android开发
Xamarin android使用Sqlite做本地存储数据库
android使用Sqlite做本地存储非常常见(打个比方就像是浏览器要做本地存储使用LocalStorage,貌似不是很恰当,大概就是这个意思)。 SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。
1369 0
|
前端开发 Android开发
Xamarin android中使用signalr实现即时通讯
前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你们,更快地熟悉使用xamarin android进行即时通讯。
1444 0
|
XML Android开发 数据格式
Xamarin android spinner的使用方法
xamarin  android spinner的如何使用呢,大多数web开发人员经常会听到DropDownList 和Combobox 这种下拉选择框,spinner 的意思差不多,有道词典一下意思是“下拉列表”、“台湾斯普”,“下拉列表组件”,“微调控件”。
1589 0
|
XML Java Android开发
Xamarin android如何反编译apk文件
Xamarin android 如何反编译 apk文件 这里推荐一款XamarinAndroid开发的小游戏,撸棍英雄,游戏很简单,的确的是有点大。等一下我们来翻翻译这个Xamarin Android 开发的小游戏 下载链接:http://shouji.
1380 0
|
定位技术 开发工具 Android开发
Xamarin android如何调用百度地图入门示例(一)
在Xamarin android如何调用百度地图呢? 首先我们要区分清楚,百度地图这是一个广泛的概念,很多刚刚接触这个名词”百度地图api”,的确是泛泛而谈,我们来看一下百度地图的官网: android上使用百度地图的有Android地图SDK,定位SDK,导航SDK,全景SDK.
1503 0

热门文章

最新文章

下一篇
无影云桌面