如何在键盘 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.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.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!","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!","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;
    }


}
}

This is The Image

,

通过这种方式解决的问题

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);
}