是否可以指定Xamarin Forms Entry Numeric Keyboard而不使用逗号或小数点分隔符?

时间:2017-06-10 16:38:09

标签: xamarin.forms

我必须创建一个用户必须输入其年龄的表单。我想使用数字键盘:

    <Entry
        x:Name="AgeEntry"
        VerticalOptions="FillAndExpand"
        HorizontalOptions="FillAndExpand"
        Keyboard="Numeric"
    />

但它甚至显示小数点字符,我只想显示数字......

4 个答案:

答案 0 :(得分:18)

要限制Entry仅接受数字,您可以使用BehaviorTrigger

这两个都会对用户输入它们做出反应。因此,为了您的使用,您可以让触发器或行为查找不是数字​​的任何字符并将其删除。

这样的行为(注意我在SO上写了所有这些并且没有尝试编译它,让我知道它是否不起作用):

using System.Linq;
using Xamarin.Forms;

namespace MyApp {

    public class NumericValidationBehavior : Behavior<Entry> {

        protected override void OnAttachedTo(Entry entry) {
            entry.TextChanged += OnEntryTextChanged;
            base.OnAttachedTo(entry);
        }

        protected override void OnDetachingFrom(Entry entry) {
            entry.TextChanged -= OnEntryTextChanged;
            base.OnDetachingFrom(entry);
        }

        private static void OnEntryTextChanged(object sender, TextChangedEventArgs args) 
        {

            if(!string.IsNullOrWhiteSpace(args.NewTextValue)) 
            { 
                 bool isValid = args.NewTextValue.ToCharArray().All(x=>char.IsDigit(x)); //Make sure all characters are numbers

                ((Entry)sender).Text = isValid ? args.NewTextValue : args.NewTextValue.Remove(args.NewTextValue.Length - 1);
            }
        }


    }
}

然后在你的XAML中:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:MyApp;assembly=MyApp"> <!-- Add the local namespace so it can be used below, change MyApp to your actual namespace -->

  <Entry x:Name="AgeEntry"
         VerticalOptions="FillAndExpand"
         HorizontalOptions="FillAndExpand"
         Keyboard="Numeric">
    <Entry.Behaviors>
      <local:NumericValidationBehavior />
    </Entry.Behaviors>
  </Entry>

</ContentPage>

答案 1 :(得分:3)

对我来说,简单的解决方案是向Entry添加一个TextChanged句柄(这是UI特定的代码,因此不会破坏MVVM)

   <Entry Text="{Binding BoundValue}" Keyboard="Numeric" TextChanged="OnTextChanged"/>

然后在代码后面

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        //lets the Entry be empty
        if ( string.IsNullOrEmpty(e.NewTextValue) ) return;

        if ( !double.TryParse(e.NewTextValue, out double value) )
        {
            ((Entry) sender).Text = e.OldTextValue;
        }
    }

更改int.Parse,如果需要一个整数

答案 2 :(得分:1)

我也面临着这个问题,但是实现这一目标的最佳方法是通过行为here is an article来详细向您展示如何实现此目标,甚至更多,例如将输入的数字值限制为给定值您在XAML中设置。

答案 3 :(得分:0)

if (!string.IsNullOrWhiteSpace(args.NewTextValue))
{
    bool isValid = args.NewTextValue.ToCharArray().All(char.IsDigit);

    ((Editor)sender).Text = isValid ? args.NewTextValue : args.OldTextValue;
}

这可以防止在编辑器中添加任何非数字字符,无论您在何处添加。 因此,如果光标位于数字的中间,并且例如在@ hvaughan3的答案中得到21h3,则只需删除最后一个字符,使21h仍然存在非数字。

我的答案将仅使用您在添加非数字字符(213)之前的值。

但是请记住! 如果您将其置于行为中并对editor.TextChanged事件做出反应,则仍然会在短时间内将Text更改为无效值,因为此事件在设置ALREADY时触发。这不是OnTextChanging事件。 与@ hvaughan3的答案相同。 为了避免因此而引起的任何问题,例如,因为您还在听后面的代码中的OnTextChanged,只需在使用新的文本值之前添加此行

if (!editor.Text.All(char.IsDigit)) return;