我怎样才能在键盘上只输入英文数字 Xamarin.forms

How can I put only English numbers in keyborard Xamarin.forms

我的应用程序有条目,点击它时显示数字键盘,问题是如果我输入阿拉伯数字它不计算但关闭应用程序 是否可以只输入英文数字或如何支持阿拉伯数字,

这是XAML文件

   <ContentPage.Content>
    <AbsoluteLayout >
        <!-- Text Box 1 -->
        <StackLayout AbsoluteLayout.LayoutBounds="0.8,0.01"  AbsoluteLayout.LayoutFlags="PositionProportional" >
            <Label Text="" FontSize="Medium" FontAttributes="Bold" TextColor="Black" x:Name="lblname2" HorizontalOptions="Center" />
            <Entry x:Name="Entnum2" WidthRequest="100"  HeightRequest="40" BackgroundColor="White" Keyboard="Numeric" MaxLength="3" HorizontalTextAlignment="Center"
                 Focused="Entnum2_Focused" TextColor="Black" FontSize="Medium" PropertyChanged="Entnum2_PropertyChanged" />
        </StackLayout>


        <!-- Text Box 1 -->
        <StackLayout AbsoluteLayout.LayoutBounds="0.2,0.01"  AbsoluteLayout.LayoutFlags="PositionProportional">
            <Label Text="" FontSize="Medium" FontAttributes="Bold" TextColor="Black" x:Name="lblname1" HorizontalOptions="Center"  />
            <Entry x:Name="Entnum1" WidthRequest="100"  HeightRequest="40" BackgroundColor="White" Keyboard="Numeric" MaxLength="3" HorizontalTextAlignment="Center"  
                   Focused="Entnum1_Focused" TextColor="Black" FontSize="Medium"  />
        </StackLayout>


        <!-- view Editors  -->
        <Frame BackgroundColor="White" AbsoluteLayout.LayoutBounds="0.5,0.94,0.95,0.6" CornerRadius="15" AbsoluteLayout.LayoutFlags="All">
            <ScrollView x:Name="scrollView" >
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition  Width="*"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <!--<Editor Text="0" FontAttributes="Bold" TextColor="Black" FontSize="Medium"  WidthRequest="100" x:Name="num1" Grid.Column="0" HorizontalOptions="Center" IsReadOnly="True" />-->
                   <Label Text="" FontAttributes="Bold" TextColor="Black" FontSize="25"  WidthRequest="100" x:Name="num1" Grid.Column="0" HorizontalOptions="Center" />
                    <Image Source="linev.png" Grid.Column="1" Opacity="0.3"/>
                    <Label Text="" FontAttributes="Bold" TextColor="Black" FontSize="25" WidthRequest="100" x:Name="num2" Grid.Column="2" HorizontalOptions="Center" />
                </Grid>
            </ScrollView>
        </Frame>


        <!-- view Buttons  -->
        <StackLayout Orientation="Horizontal"   AbsoluteLayout.LayoutBounds="0.5,0.14,0.95,0.09" AbsoluteLayout.LayoutFlags="All" >
            <Button TextColor="#1C84D3"  Text="تراجع"  x:Name="btnBack"  Clicked="btnBack_Clicked" HorizontalOptions="CenterAndExpand" BackgroundColor="White" CornerRadius="15" HeightRequest="70"
                  WidthRequest="70" FontSize="20" />
            <Button TextColor="#1C84D3" Text="سجل" Clicked="btnRegister_Clicked" HorizontalOptions="CenterAndExpand" BackgroundColor="White" FontSize="20" CornerRadius="15" HeightRequest="70"
                  WidthRequest="70" />
        </StackLayout>

         <controls:AdControlView AbsoluteLayout.LayoutBounds="0.5,0.26,0.95,0.14" AbsoluteLayout.LayoutFlags="All"
                               AdUnitId="{Static local:Constants.AdUnitIdTest}"/>


    </AbsoluteLayout>
</ContentPage.Content>

这是XAML.cs

        int SUM1 = 0;
    // SUM2 لتخزين النتيجة الثانية  
    int SUM2 = 0;
    // DisplayPromptAsync تخزين حالة الاشعار 
    string action;
    // لتبديل بين entrys 
    int tap = 1;
    // عدد الاعبين 
    int playercount = 1;

    int count = 0;
    bool scroll = false;

    public Blootrecord(bool newplay)
    {
        InitializeComponent();



        if (newplay)
        {
            DisplayPrompt(lblname1, "اسم فريقهم");
            DisplayPrompt(lblname2, "اسم فريقنا?");

        }
        else
        {
            // اذا مالنت الثيمة ب False هذا يعني انه يريد الرجوع لاخر لعية 
            // هذه اسطر لجلب اخر قيم تم تخزينها 
            lblname1.Text = Preferences.Get("lblname1", "");
            lblname2.Text = Preferences.Get("lblname2", "");
            num1.Text = Preferences.Get("num1", "");
            num2.Text = Preferences.Get("num2", "");
            SUM1 = Convert.ToInt32(Preferences.Get("SUM1", "0"));
            SUM2 = Convert.ToInt32(Preferences.Get("SUM2", "0"));
            count = Convert.ToInt32(Preferences.Get("count", "0"));


        }
        scrollView.HeightRequest = num1.HeightRequest;

    }


    /// <summary>
    /// هذه دالة لعررض الاشعار
    /// </summary>
    /// <param name="label"></param>
    ///         /// <param name="label2"></param>

    /// <param name="str"></param>
    async void DisplayPrompt(Label label, string str)
    {
        var s = await DisplayPromptAsync("Alert", str);
        if (string.IsNullOrEmpty(s))
             label.Text = "فريق" + playercount++;           
        else
            label.Text = s;
    }

    /// <summary>
    /// زر سجل 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    ///

    private async void btnRegister_Clicked(object sender, EventArgs e)
    {
        try
        {
            scrollView.HeightRequest = num1.HeightRequest;

            scroll = false;

            // اضافة سط في Editors مع القيمه المدخله 
            num1.Text += "\n" + Entnum1.Text;
            num2.Text += "\n" + Entnum2.Text;
            //اذا كان الentry فارغ يبدل القيمه ب صفر 
            if (string.IsNullOrEmpty(Entnum1.Text))
            {
                num1.Text += "0";
            }
            if (string.IsNullOrEmpty(Entnum2.Text))
            {
                num2.Text += "0";
            }
            //تحويل القيمه الي عدد صحيح وجمعها ع اخر قميه 
            SUM1 += int.Parse(num1.Text.Substring(num1.Text.LastIndexOf("\n") + 1));
            SUM2 += int.Parse(num2.Text.Substring(num2.Text.LastIndexOf("\n") + 1));
            // اذا كانت القيمه اقل من 152 يتم اضافة سطر ثم خط ثم قيمه الجمع في كل Editor 
            if (SUM1 < 152 && SUM2 < 152)
            {
                num1.Text += "\n" + "------";
                num2.Text += "\n" + "------";
                num1.Text += "\n" + SUM1;
                num2.Text += "\n" + SUM2;
            }
            else
            {
                // يتم عرض  اكير قيمه مع اكبر فائز
                if (SUM1 > SUM2)
                {
                    action = await DisplayActionSheet(" هاردلك الفوز لهم "  + SUM1 + " ", "اغلاق", "لعبة جديدة");

                }
                else if (SUM1 < SUM2)
                {

                    action = await DisplayActionSheet(" مبروك الفوز لنا"  + SUM2 + "", "اغلاق", "لعبة جديدة");
                }
                else


                {

                    action = await DisplayActionSheet("تعادل", "اغلاق", "لعبة جديدة");
                }
                // اذا قمت بأختيار لعبة جديدة
                if (action == "لعبة جديدة")
                {
                    // يحذف جميع القيم ولاكن يبقي اسم العبين 
                    num1.Text = num2.Text = "0";
                    Entnum1.Text = Entnum2.Text = null;
                    SUM1 = SUM2 = 0;
                    await scrollView.ScrollToAsync(num1, ScrollToPosition.Start, true);
                    count = 0;
                    scroll = true;
                }
            }


            Entnum1.Text = Entnum2.Text = null;
            // store data 
            // تخزين البيانات في كل مره 
            Preferences.Set("lblname1", lblname1.Text);
            Preferences.Set("lblname2", lblname2.Text);
            Preferences.Set("num1", num1.Text);
            Preferences.Set("num2", num2.Text);
            Preferences.Set("SUM1", SUM1.ToString());
            Preferences.Set("SUM2", SUM2.ToString());



            count++;
            if (count >= 5 && count <= 7 && !scroll)
            {
                await scrollView.ScrollToAsync(num1, ScrollToPosition.Center, true);
            }
            else if (count > 7 && !scroll)
            {
                await scrollView.ScrollToAsync(num1, ScrollToPosition.End, true);

            }
        }
        catch (Exception ex)
        {
            // في حالة وجود خطأ غير متوقع 
            await DisplayAlert("Opps!", ex.Message, "Ok");
            await Navigation.PopAsync();
        }
    }



    void btnBack_Clicked(System.Object sender, System.EventArgs e)
    {

        try
        {


            if (num1.Text != "0" && num2.Text != "0")
            {
                // يتم اذالة ثلاث اسطر وطرح قيمة السطر الثالث من المجموع الكلي ثم ازالة السطر الثالث 
                // editor number one 
                num1.Text = num1.Text.Remove(num1.Text.LastIndexOf("\n"));
                num1.Text = num1.Text.Remove(num1.Text.LastIndexOf("\n"));
                SUM1 -= int.Parse(num1.Text.Substring(num1.Text.LastIndexOf("\n") + 1));
                num1.Text = num1.Text.Remove(num1.Text.LastIndexOf("\n"));
                // editor number two
                num2.Text = num2.Text.Remove(num2.Text.LastIndexOf("\n"));
                num2.Text = num2.Text.Remove(num2.Text.LastIndexOf("\n"));
                SUM2 -= int.Parse(num2.Text.Substring(num2.Text.LastIndexOf("\n") + 1));
                num2.Text = num2.Text.Remove(num2.Text.LastIndexOf("\n"));
            }
        }
        catch (Exception ex)
        {

            DisplayAlert("Opps!", ex.Message, "Ok");
        }
    }


    private void Entnum1_Focused(object sender, FocusEventArgs e)
    {
        tap = 1;
    }

    private void Entnum2_Focused(object sender, FocusEventArgs e)
    {
        tap = 2;
    }

    private void Entnum2_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        // في حالة اختيار Closr  

        if (action == "اغلاق")
        {
            // حزف جميع القيم المخزنه 
            Preferences.Clear();
            // الرجوع الي الصفحة الاولة  
            Navigation.PopAsync();
        }
    }
}

}

This is an example of error , it calculates only English number 一旦我输入阿拉伯数字,它就会关闭应用程序 谢谢

如果您想使用阿拉伯数字,编译器会将阿拉伯数字视为字符而非数字,您必须使用 case 语句或字典等手动映射它们。如果您将它们解析为 int,则会抛出异常。

我更改了我的代码,但仍然无法正常工作

    // متغيرات مهمه 

    Dictionary<string, string> numberNames;


    // SUM1 لتخزين النتيجة الاولة 
    int SUM1 = 0;
    // SUM2 لتخزين النتيجة الثانية  
    int SUM2 = 0;
    // DisplayPromptAsync تخزين حالة الاشعار 
    string action;
    // لتبديل بين entrys 
    int tap = 1;
    // عدد الاعبين 
    int playercount = 1;

    int count = 0;
    bool scroll = false;

    public Blootrecord(bool newplay)
    {
        InitializeComponent();


      


        if (newplay)
        {
            DisplayPrompt(lblname1, "اسم فريقهم");
            DisplayPrompt(lblname2, "اسم فريقنا?");

        }
        else
        {
            // اذا مالنت الثيمة ب False هذا يعني انه يريد الرجوع لاخر لعية 
            // هذه اسطر لجلب اخر قيم تم تخزينها 
            lblname1.Text = Preferences.Get("lblname1", "");
            lblname2.Text = Preferences.Get("lblname2", "");
            num1.Text = Preferences.Get("num1", "");
            num2.Text = Preferences.Get("num2", "");
            SUM1 = Convert.ToInt32(Preferences.Get("SUM1", "0"));
            SUM2 = Convert.ToInt32(Preferences.Get("SUM2", "0"));
            count = Convert.ToInt32(Preferences.Get("count", "0"));


        }

        numberNames = new Dictionary<string, string>();
        numberNames.Add("0", "۰"); //adding a key/value using the Add() method
        numberNames.Add("1", "۱");
        numberNames.Add("2", "۲");
        numberNames.Add("3", "۳");
        numberNames.Add("4", "٤");
        numberNames.Add("5", "٥");
        numberNames.Add("6", "٦");
        numberNames.Add("7", "٧");
        numberNames.Add("8", "۸");
        numberNames.Add("9", "۹");


        scrollView.HeightRequest = num1.HeightRequest;

    }


    /// <summary>
    /// هذه دالة لعررض الاشعار
    /// </summary>
    /// <param name="label"></param>
    ///         /// <param name="label2"></param>

    /// <param name="str"></param>
    async void DisplayPrompt(Label label, string str)
    {
        var s = await DisplayPromptAsync("Alert", str);
        if (string.IsNullOrEmpty(s))
            label.Text = "فريق" + playercount++;
        else
            label.Text = s;
    }

    /// <summary>
    /// زر سجل 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    ///

    private async void btnRegister_Clicked(object sender, EventArgs e)
    {


        try
        {

            Entnum1 = ARCH(Entnum1);
            Entnum2 = ARCH(Entnum2);

            scrollView.HeightRequest = num1.HeightRequest;

            scroll = false;

            // اضافة سط في Editors مع القيمه المدخله 
            num1.Text += "\n" + Entnum1.Text;
            num2.Text += "\n" + Entnum2.Text;
            //اذا كان الentry فارغ يبدل القيمه ب صفر 
            if (string.IsNullOrEmpty(Entnum1.Text))
            {
                num1.Text += "0";
            }
            if (string.IsNullOrEmpty(Entnum2.Text))
            {
                num2.Text += "0";
            }
            //تحويل القيمه الي عدد صحيح وجمعها ع اخر قميه 
            SUM1 += int.Parse(num1.Text.Substring(num1.Text.LastIndexOf("\n") + 1));
            SUM2 += int.Parse(num2.Text.Substring(num2.Text.LastIndexOf("\n") + 1));
            // اذا كانت القيمه اقل من 152 يتم اضافة سطر ثم خط ثم قيمه الجمع في كل Editor 
            if (SUM1 < 152 && SUM2 < 152)
            {
                num1.Text += "\n" + "------";
                num2.Text += "\n" + "------";
                num1.Text += "\n" + SUM1;
                num2.Text += "\n" + SUM2;
            }
            else
            {
                // يتم عرض  اكير قيمه مع اكبر فائز
                if (SUM1 > SUM2)
                {
                    action = await DisplayActionSheet(" هاردلك الفوز لهم " + SUM1 + " ", "اغلاق", "لعبة جديدة");

                }
                else if (SUM1 < SUM2)
                {

                    action = await DisplayActionSheet(" مبروك الفوز لنا" + SUM2 + "", "اغلاق", "لعبة جديدة");
                }
                else


                {

                    action = await DisplayActionSheet("تعادل", "اغلاق", "لعبة جديدة");
                }
                // اذا قمت بأختيار لعبة جديدة
                if (action == "لعبة جديدة")
                {
                    // يحذف جميع القيم ولاكن يبقي اسم العبين 
                    num1.Text = num2.Text = "0";
                    Entnum1.Text = Entnum2.Text = null;
                    SUM1 = SUM2 = 0;
                    await scrollView.ScrollToAsync(num1, ScrollToPosition.Start, true);
                    count = 0;
                    scroll = true;
                }
            }


            Entnum1.Text = Entnum2.Text = null;
            // store data 
            // تخزين البيانات في كل مره 
            Preferences.Set("lblname1", lblname1.Text);
            Preferences.Set("lblname2", lblname2.Text);
            Preferences.Set("num1", num1.Text);
            Preferences.Set("num2", num2.Text);
            Preferences.Set("SUM1", SUM1.ToString());
            Preferences.Set("SUM2", SUM2.ToString());



            count++;
            if (count >= 5 && count <= 7 && !scroll)
            {
                await scrollView.ScrollToAsync(num1, ScrollToPosition.Center, true);
            }
            else if (count > 7 && !scroll)
            {
                await scrollView.ScrollToAsync(num1, ScrollToPosition.End, true);

            }
        }
        catch (Exception ex)
        {
            // في حالة وجود خطأ غير متوقع 
            await DisplayAlert("Opps!", ex.Message, "Ok");
            await Navigation.PopAsync();
        }
    }



    void btnBack_Clicked(System.Object sender, System.EventArgs e)
    {

        try
        {


            if (num1.Text != "0" && num2.Text != "0")
            {
                // يتم اذالة ثلاث اسطر وطرح قيمة السطر الثالث من المجموع الكلي ثم ازالة السطر الثالث 
                // editor number one 
                num1.Text = num1.Text.Remove(num1.Text.LastIndexOf("\n"));
                num1.Text = num1.Text.Remove(num1.Text.LastIndexOf("\n"));
                SUM1 -= int.Parse(num1.Text.Substring(num1.Text.LastIndexOf("\n") + 1));
                num1.Text = num1.Text.Remove(num1.Text.LastIndexOf("\n"));
                // editor number two
                num2.Text = num2.Text.Remove(num2.Text.LastIndexOf("\n"));
                num2.Text = num2.Text.Remove(num2.Text.LastIndexOf("\n"));
                SUM2 -= int.Parse(num2.Text.Substring(num2.Text.LastIndexOf("\n") + 1));
                num2.Text = num2.Text.Remove(num2.Text.LastIndexOf("\n"));
            }
        }
        catch (Exception ex)
        {

            DisplayAlert("Opps!", ex.Message, "Ok");
        }
    }


    private void Entnum1_Focused(object sender, FocusEventArgs e)
    {
        tap = 1;
    }

    private void Entnum2_Focused(object sender, FocusEventArgs e)
    {
        tap = 2;
    }

    private void Entnum2_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        // في حالة اختيار Closr  

        if (action == "اغلاق")
        {
            // حزف جميع القيم المخزنه 
            Preferences.Clear();
            // الرجوع الي الصفحة الاولة  
            Navigation.PopAsync();
        }
    }

    Entry ARCH(Entry entry)
    {
        for (var i = 0; i < 10; i++)
        {
            entry.Text = entry.Text.Replace(numberNames[i.ToString()], i.ToString());
        }

        return entry;
    }


}
}

通过这种方式解决了问题

public int ArabicNumber (string unicode )
{
    var str = unicode.Replace('\u0660', '0')
        .Replace('0','0')
        .Replace('\u0661', '1')
        .Replace('\u0662', '2')
        .Replace('\u0663', '3')
        .Replace('\u0664', '4')
        .Replace('\u0665', '5')
        .Replace('\u0666', '6')
        .Replace('\u0667', '7')
        .Replace('\u0668', '8')
        .Replace('\u0669', '9');

    return int.Parse(str);
}