Xamarin入门 PhoneWord程序

转自官方指南https://developer.xamarin.com/zh-cn/guides/xamarin-forms/getting-started/hello-xamarin-forms/quickstart/

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

创建 Phoneword 应用程序

如下所示:(基本操作,心疼下自己只配图了):
这里写图片描述
下一步
这里写图片描述
下一步
这里写图片描述
下一步
这里写图片描述
下一步
这里写图片描述
马上完成
这里写图片描述

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

这里写图片描述

写代码了O(∩_∩)O~~

  1. 在“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">
            <On Platform="iOS" Value="20, 40, 20, 20" />
            <On Platform="Android, WinPhone, Windows" Value="20" />
        </OnPlatform>
    </ContentPage.Padding>
    <StackLayout>
      <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>

2.在“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);
            }
        }
    }
}

3.在“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
        }
    }
}

4.在“解决方案资源管理器”中,右键单击“Phoneword”项目,然后选择“添加”>“新建项…”:在“添加新项”对话框中,选择“Visual C#”>“代码”>“类”,将新文件命名为 PhoneTranslator,然后单击“添加”按钮:
这里写图片描述
5.在“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;
        }
    }
}

6.在“解决方案资源管理器”中,右键单击“Phoneword”项目,然后选择“添加”>“新建项…”:在“添加新项”对话框中,选择“Visual C#”>“代码”>“界面”,将新文件命名为 IDialer,然后单击“添加”按钮:这里写图片描述
7.在“IDialer.cs”中,删除所有模板代码并将其替换为以下代码。 此代码将定义 Dial 方法,必须在每个平台上实现此方法,才可拨打翻译后的电话号码:

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

8.在“解决方案资源管理器”中,右键单击“Phoneword.iOS”项目,然后选择“添加”>“新建项…”:在“添加新项”对话框中,选择“Apple”>“代码”>“类”,将新文件命名为 PhoneDialer,然后单击“添加”按钮:
这里写图片描述
9.在“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));
        }
    }
}

10.在“解决方案资源管理器”中,右键单击“Phoneword.Android”项目,然后选择“添加”>“新建项…”:在“添加新项”对话框中,选择“Visual C#”>“Android”>“类”,将新文件命名为 PhoneDialer,然后单击“添加”按钮:
这里写图片描述
11.在“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;
        }
    }
}

12.在“解决方案资源管理器”的“Phoneword.Android”项目中,双击“属性”,然后选择“Android 清单”选项卡:在“所需的权限”部分中,启用“CALL_PHONE”权限。 这将向应用程序授予进行电话呼叫的权限:这里写图片描述

这里写图片描述
13.在“解决方案资源管理器”中,右键单击“Phoneword.UWP”项目,然后选择“添加”>“新建项…”:在“添加新项”对话框中,选择“Visual C#”>“代码”>“类”,将新文件命名为 PhoneDialer,然后单击“添加”按钮:
这里写图片描述

14.在“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 Task 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);
        }
    }
}

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

这里写图片描述

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

这里写图片描述

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

这里写图片描述

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

这里写图片描述

16.在 Visual Studio 中,选择“生成”>“生成解决方案”菜单项,或按 Ctrl+Shift+B。 将生成应用程序,Visual Studio 状态栏中将显示一条成功消息:

这里写图片描述

下一部分,我将学习添加history iPhonenumber 实现页面切换。

猜你喜欢

转载自blog.csdn.net/weixin_40132006/article/details/78701249
今日推荐