Xamarin.Forms 快速入门

本演练介绍如何创建一个应用程序,它将字母数字电话号码(由用户输入)转换为数字电话号码,然后呼叫该号码。 最终的应用程序如下所示:

创建 Phoneword 应用程序,如下所示:

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

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

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

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

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

  6. 在“解决方案资源管理器”中,右键单击“Phoneword”解决方案,选择“管理解决方案 NuGet 包...”:

  7. 在“管理解决方案包”对话框中,选择“更新”选项卡和“Xamarin.Forms”包,然后将包更新到最新稳定版本:

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

  9. 在“MainPage.xaml”中,删除所有模板代码并将其替换为以下代码。 此代码以声明方式定义页面上的用户界面:

    <?xml version="1.0" encoding="UTF-8"?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="Phoneword.MainPage">
         <ContentPage.Padding>
             <OnPlatform x:TypeArguments="Thickness"
                        iOS="20, 40, 20, 20"
                        Android="20, 20, 20, 20"
                        WinPhone="20, 20, 20, 20" />
         </ContentPage.Padding>
        <ContentPage.Content>
            <StackLayout VerticalOptions="FillAndExpand"
                         HorizontalOptions="FillAndExpand"
                         Orientation="Vertical"
                         Spacing="15">
                <Label Text="Enter a Phoneword:" />
                <Entry x:Name="phoneNumberText" Text="1-855-XAMARIN" />
                <Button x:Name="translateButon" Text="Translate" Clicked="OnTranslate" />
                <Button x:Name="callButton" Text="Call" IsEnabled="false" Clicked="OnCall" />
            </StackLayout>
        </ContentPage.Content>
    </ContentPage>

    按 Ctrl+S,保存对 MainPage.xaml 所做的更改,然后关闭文件。

  10. 在“解决方案资源管理器”中,展开“MainPage.xaml”,然后双击 MainPage.xaml.cs 将其打开:

  11. 在“MainPage.xaml.cs”中,删除所有模板代码并将其替换为以下代码。 如果分别在用户界面中单击“翻译”和“调用”按钮,作为响应,将分别执行 OnTranslate 和 OnCall 方法:

    using System;
    using Xamarin.Forms;
    
    namespace Phoneword
    {
        public partial class MainPage : ContentPage
        {
            string translatedNumber;
    
            public MainPage ()
            {
                InitializeComponent ();
            }
    
            void OnTranslate (object sender, EventArgs e)
            {
                translatedNumber = Core.PhonewordTranslator.ToNumber (phoneNumberText.Text);
                if (!string.IsNullOrWhiteSpace (translatedNumber)) {
                    callButton.IsEnabled = true;
                    callButton.Text = "Call " + translatedNumber;
                } else {
                    callButton.IsEnabled = false;
                    callButton.Text = "Call";
                }
            }
    
            async void OnCall (object sender, EventArgs e)
            {
                if (await this.DisplayAlert (
                        "Dial a Number",
                        "Would you like to call " + translatedNumber + "?",
                        "Yes",
                        "No")) {
                    var dialer = DependencyService.Get<IDialer> ();
                    if (dialer != null)
                        dialer.Dial (translatedNumber);
                }
            }
        }
    }

    按 Ctrl+S,保存对 MainPage.xaml.cs 所做的更改,然后关闭文件。

  12. 在“解决方案资源管理器”中,展开“App.xaml”,然后双击 App.xaml.cs 将其打开:

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

    using Xamarin.Forms;
    using Xamarin.Forms.Xaml;
    
    [assembly: XamlCompilation(XamlCompilationOptions.Compile)]
    namespace Phoneword
    {
        public partial class App : Application
        {
            public App()
            {
                InitializeComponent();
                MainPage = new MainPage();
            }
    
            protected override void OnStart()
            {
                // Handle when your app starts
            }
    
            protected override void OnSleep()
            {
                // Handle when your app sleeps
            }
    
            protected override void OnResume()
            {
                // Handle when your app resumes
            }
        }
    }

    通过按 Ctrl+S,保存对 App.xaml.cs 所做的更改,然后关闭文件。

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

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

  16. 在“PhoneTranslator.cs”中,删除所有模板代码并将其替换为以下代码。 此代码会将手机词翻译为电话号码:

    using System.Text;
    
    namespace Core
    {
        public static class PhonewordTranslator
        {
            public static string ToNumber(string raw)
            {
                if (string.IsNullOrWhiteSpace(raw))
                    return null;
    
                raw = raw.ToUpperInvariant();
    
                var newNumber = new StringBuilder();
                foreach (var c in raw)
                {
                    if (" -0123456789".Contains(c))
                        newNumber.Append(c);
                    else
                    {
                        var result = TranslateToNumber(c);
                        if (result != null)
                            newNumber.Append(result);
                        // Bad character?
                        else
                            return null;
                    }
                }
                return newNumber.ToString();
            }
    
            static bool Contains(this string keyString, char c)
            {
                return keyString.IndexOf(c) >= 0;
            }
    
            static readonly string[] digits = {
                "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"
            };
    
            static int? TranslateToNumber(char c)
            {
                for (int i = 0; i < digits.Length; i++)
                {
                    if (digits[i].Contains(c))
                        return 2 + i;
                }
                return null;
            }
        }
    }

    通过按 Ctrl+S,保存对 PhoneTranslator.cs 所做的更改,然后关闭文件。

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

  18. 在“添加新项”对话框中,选择“Visual C#”>“代码”>“界面”,将新文件命名为 IDialer,然后单击“添加”按钮:

  19. 在“IDialer.cs”中,删除所有模板代码并将其替换为以下代码。 此代码将定义 Dial 方法,必须在每个平台上实现此方法,才可拨打翻译后的电话号码:

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

    通过按 Ctrl+S,保存对 IDialer.cs 所做的更改,然后关闭文件。

    此时完成了应用程序的常用代码。 此时,可将特定于平台的电话拨号程序实现为 DependencyService

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

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

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

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

    通过按 Ctrl+S,保存对 PhoneDialer.cs 所做的更改,然后关闭文件。

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

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

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

    using Android.Content;
    using Android.Telephony;
    using Phoneword.Droid;
    using System.Linq;
    using Xamarin.Forms;
    using Uri = Android.Net.Uri;
    
    [assembly: Dependency(typeof(PhoneDialer))]
    namespace Phoneword.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;
            }
        }
    }

    通过按 Ctrl+S,保存对 PhoneDialer.cs 所做的更改,然后关闭文件。

  26. 在“解决方案资源管理器”的“Phoneword.Android”项目中,双击“属性”,然后选择“Android 清单”选项卡:

  27. 在“所需的权限”部分中,启用“CALL_PHONE”权限。 这将向应用程序授予进行电话呼叫的权限:

    通过按 Ctrl+S,保存对清单所做的更改,然后关闭文件。

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

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

  30. 在“PhoneDialer.cs”中,删除所有模板代码并将其替换为以下代码。 此代码将创建 Dial 和 helper 方法,这些方法将在通用 Windows 平台上用于拨打翻译后的电话号码:

    using Phoneword.UWP;
    using System;
    using System.Threading.Tasks;
    using Windows.ApplicationModel.Calls;
    using Windows.UI.Popups;
    using Xamarin.Forms;
    
    [assembly: Dependency(typeof(PhoneDialer))]
    namespace Phoneword.UWP
    {
        public class PhoneDialer : IDialer
        {
            bool dialled = false;
    
            public bool Dial(string number)
            {
                DialNumber(number);
                return dialled;
            }
    
            async void DialNumber(string number)
            {
                var phoneLine = await GetDefaultPhoneLineAsync();
                if (phoneLine != null)
                {
                    phoneLine.Dial(number, number);
                    dialled = true;
                }
                else
                {
                    var dialog = new MessageDialog("No line found to place the call");
                    await dialog.ShowAsync();
                    dialled = false;
                }
            }
    
            async Task<PhoneLine> GetDefaultPhoneLineAsync()
            {
                var phoneCallStore = await PhoneCallManager.RequestStoreAsync();
                var lineId = await phoneCallStore.GetDefaultLineAsync();
                return await PhoneLine.FromIdAsync(lineId);
            }
        }
    }

    通过按 Ctrl+S,保存对 PhoneDialer.cs 所做的更改,然后关闭文件。

  31. 在“解决方案资源管理器”的“Phoneword.UWP”项目中,右键单击“引用”,然后选择“添加引用...”:

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

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

  34. 在“功能”页上,启用“电话呼叫”功能。 这将向应用程序授予进行电话呼叫的权限:

    通过按 Ctrl+S,保存对清单所做的更改,然后关闭文件。

  35. 在 Visual Studio 中,选择“生成”>“生成解决方案”菜单项,或按 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 开发应用程序的基础知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值