限制Xamarin.Forms中输入字段的输入长度和字符

Ken*_*n K 26 c# textinput keyboard-events xamarin.forms

如何限制在Xamarin.Forms中的Entry控件中输入的长度和字符.我需要创建自定义控件吗?有没有办法从Entry(或其他控件)派生,所以我可以应用必要的每平台输入限制.

一个示例是一个数字字段,最多只能包含3个字符,仅限数字.

将Entry控件的Keyboard属性设置为Keyboard.Numeric仅设置iOS的键盘.它不限制实际的文本输入 - 即我仍然可以输入非数字字符.我也没有看到限制进入长度的方法.

Fem*_*jin 18

您可以在Entry字段中限制charecters的数量,如下所示,

  int restrictCount = <your restriction length> //Enter your number of character restriction
  Entry entry = new Entry();
  entry.TextChanged += OnTextChanged;

  void OnTextChanged(object sender, EventArgs e)
  {
    Entry entry = sender as Entry;
    String val = entry.Text; //Get Current Text

    if(val.Length > restrictCount)//If it is more than your character restriction
    {
     val = val.Remove(val.Length - 1);// Remove Last character 
     entry.Text = val; //Set the Old value
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • 而不是删除最后一个字符执行此操作:`val = e.NewTextValue.Substring(0,MaxLength)`因为用户可能会将多个字符复制/传递到Entry字段中. (3认同)

小智 15

我会使用行为.更多信息:https://developer.xamarin.com/guides/xamarin-forms/behaviors/creating/

示例是使用数字键盘输入.但它可以用于任何键盘.

XAML用法:

<ContentPage
   xmlns:behaviors="clr-namespace:myApp.Behaviors;assembly=myApp"

   <Entry
       Keyboard="Numeric"
       Text="{Binding EntryText}" >
       <Entry.Behaviors>
           <behaviors:EntryLengthValidatorBehavior MaxLength="3" />
       </Entry.Behaviors>
   </Entry>
Run Code Online (Sandbox Code Playgroud)

行为

public class EntryLengthValidatorBehavior : Behavior<Entry>
{
    public int MaxLength { get; set; }

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

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

    void OnEntryTextChanged(object sender, TextChangedEventArgs e)
    {
        var entry = (Entry)sender;

        // if Entry text is longer then valid length
        if (entry.Text.Length > this.MaxLength)
        {
            string entryText = entry.Text;

            entryText = entryText.Remove(entryText.Length - 1); // remove last char

            entry.Text = entryText;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 9

你可以使用Binding; 例如,我想持有一个不能超过100的支付价值.所以我写了一堂课

puclic class Payment : INotifyPropertyChanged
{
    private int _amountDecimals;
    public int AmountDecimals
    {
        get
        {
            return _amountDecimals;
        }

        set
        {
            if (value <= 100)
            {
                _amountDecimals = value;
            }
            OnPropertyChanged();
        }
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果用户输入值直到它不超过100,则此属性将设置AmountDecimals值

然后只需通过页面构造函数(或来自xaml)上的代码设置绑定

var myPayment =new Payment(); //this will hold page(view) data
BindingContext = myPayment;
var paymentEntry = new Entry();
paymentEntry.Keyboard = Keyboard.Numeric;
paymentEntry.SetBinding(Entry.TextProperty, "AmountDecimals");            
Run Code Online (Sandbox Code Playgroud)

因此,用户为条目输入数值,但如果他/她尝试输入的值大于100,则绑定只是将其反转为旧值.您可以将代码编写到类的属性中(在setter上).因此,如果你想要一些属性只能携带5个字符,你可以写这样的东西(代码可能是错误的,我没有编译它们:))

    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }

        set
        {
            if ((value!= null && value.length <= 5) || value == null)
            {
                _name = value;
            }
            OnPropertyChanged();
        }
Run Code Online (Sandbox Code Playgroud)


小智 5

我使用具有Bindable属性的自定义条目控件来获取大写和最大长度.

控制(MyEntry.cs)

class NewPaymentEntry : Entry
{
   public NewPaymentEntry()
    {
        base.TextChanged += EditText;
    }
    public void EditText(object sender, TextChangedEventArgs args)
    {
        Entry e = sender as Entry;
        String val = e.Text;

        if (string.IsNullOrEmpty(val))
            return;

        if (Uppercase )
            val = val.ToUpper();

        if(MaxLength > 0 && val.Length > MaxLength)
        {
                val = val.Remove(val.Length - 1);
        }
        e.Text = val;

    }

    public static readonly BindableProperty UppercaseProperty = BindableProperty.Create<MyEntry, bool>(p => p.Uppercase, false);

    public bool Uppercase
    {
        get
        {
            return (bool)GetValue(UppercaseProperty);
        }
        set
        {
            SetValue(UppercaseProperty, value);
        }
    }

    public static readonly BindableProperty MaxLengthProperty = BindableProperty.Create<MyEntry, int>(p => p.MaxLength, 0);

    public int MaxLength
    {
        get
        {
            return (int)GetValue(MaxLengthProperty);
        }
        set
        {
            SetValue(MaxLengthProperty, value);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从xaml调用它就像

                  <MyEntry  Text="{Binding MyBindingProp}"
                            Uppercase="True"
                            MaxLength="11"/>
Run Code Online (Sandbox Code Playgroud)

  • 我有自定义控件出来我的屁股,你会认为xamarin偶尔会更新他们的默认控件,包括像这样的常见的东西! (4认同)

Pet*_*ete 3

Entry控件中似乎没有内置属性来限制字符/长度。您可以通过以下两种可用方法之一完成文本限制和字符输入:-

  1. 是的 - 您可以直接从Entry派生来创建您自己的派生,然后进一步自定义它,例如挂钩到TextChanged事件处理程序。没有按键处理程序,因此您必须对传递到e.NewTextValue的完整值进行有效性检查。如果新条目与您的要求不匹配,您只需设置.Text=e.OldTextValue即可恢复到最后一个有效条目。

  2. 如果您想挂钩每个平台本机控件的事件处理程序,您可以编写自己的自定义渲染器控件以进行更精细的控制。