例如,数值字段应该限制最多只能输入三个数字字符。
将 Entry 控件的 Keyboard 属性设置为 Keyboard.Numeric 仅适用于 iOS 平台。它不会限制实际文本输入 - 即我仍然可以输入非数字字符。也没有看到限制输入长度的方法。
我会使用Behaviors。更多信息请参见: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>
行为
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;
}
}
}
您可以按照以下方式在输入字段中限制字符数:
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
}
}
val = e.NewTextValue.Substring(0, MaxLength)
,因为用户可能会将多个字符复制/粘贴到输入框中。 - A-Sharabianipuclic 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));
}
}
这个属性将在用户输入的值超过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");
用户输入一个数字值到输入框,但如果他/她试图输入一个大于100的值,绑定将其还原为旧值。您可以像这样在类属性上编写代码(在设置器中)。因此,如果您想让某个属性仅携带5个字符,可以编写类似于以下内容的代码(代码可能有误,我没有编译它们:))
private string _name;
public string Name
{
get
{
return _name;
}
set
{
if ((value!= null && value.length <= 5) || value == null)
{
_name = value;
}
OnPropertyChanged();
}
我使用了一个具有可绑定属性的自定义输入控件,用于大写和最大长度。
控件(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);
}
}
}
在xaml中调用它的方式如下:
<MyEntry Text="{Binding MyBindingProp}"
Uppercase="True"
MaxLength="11"/>
BindableProperty
,而 MaxLengh 和 Uppercase 可以像这样成为简单属性:public int MaxLenght {get; set;}
。 - A-Sharabiani定义一个具有所需属性的新自定义条目:
public class CustomEntry : Entry
{
public int MaxLength { get; set; }
public bool IsNumeric { get; set; }
public int MinValue { get; set; }
public int MaxValue { get; set; }
public CustomEntry()
{
// Initialize properties.
IsNumeric = false;
MaxLength = int.MaxValue;
MinValue = int.MinValue;
MaxValue = int.MaxValue;
// Set the events.
base.TextChanged += OnTextChanged;
}
public void OnTextChanged(object sender, TextChangedEventArgs e)
{
Entry entry = sender as Entry;
// If empty, set it to empty string.
if (string.IsNullOrWhiteSpace(e.NewTextValue))
{
entry.Text = string.Empty;
return;
}
// Check if it is numeric.
if (IsNumeric)
{
int value;
var isValid = int.TryParse(e.NewTextValue, out value);
if (!isValid)
{
entry.Text = e.OldTextValue;
return;
}
// Check the min/max values.
if (value > MaxValue || value < MinValue)
{
entry.Text = e.OldTextValue;
}
}
// If not numeric, check the length.
if (e.NewTextValue.Length > MaxLength)
entry.Text = e.OldTextValue;
}
}
在XAML中使用它:
<controls:CustomEntry Text="{Binding months}" Keyboard="Numeric" IsNumeric="true" MaxLength="2" MinValue="1" MaxValue="12"/>
注意:与大多数答案不同的是,不要移除最后一个字符,更安全的做法是将文本设置为旧文本,因为用户可能会将多个字符粘贴到文本框中。
int.TryParse(...)
修改为float.TryParse(...)
。 - A-Sharabiani在输入控件(Entry)中似乎没有内置的属性来限制字符/长度。您可以通过以下两种方法之一来实现文本限制和字符输入:
是的 - 您可以直接从输入控件(Entry)派生出自己的衍生版本,然后进一步自定义它,例如挂钩到TextChanged事件处理程序。没有按键事件处理程序,因此您必须对传递给e.NewTextValue的完整值进行有效性检查。如果新条目不符合您的要求,则可以将.Text = e.OldTextValue设置为返回上一个有效条目。
如果您想要挂钩到每个平台本地控件的事件处理程序,则可以编写自己的自定义渲染器控件以获得更精细的控制。
public class TextValidationBehavior : Behavior<Entry>
{
// This can be bound to view model property to be informed
public static readonly BindableProperty IsValidProperty = IsValidPropertyKey.BindableProperty;
public bool IsValid
{
get { return (bool)base.GetValue(IsValidProperty); }
private set { base.SetValue(IsValidPropertyKey, value); }
}
// Attach delegate to text changed event
protected override void OnAttachedTo(Entry entry)
{
entry.TextChanged += OnEntryTextChanged;
base.OnAttachedTo(entry);
}
// Detach delegate from text changed event
protected override void OnDetachingFrom(Entry entry)
{
entry.TextChanged -= OnEntryTextChanged;
base.OnDetachingFrom(entry);
}
void OnEntryTextChanged(object sender, TextChangedEventArgs e)
{
var text = e.NewTextValue;
IsValid = Validate(text); // Implement this as needed
}
}
<ContentPage xmlns:local="clr-namespace:Behaviors;assembly=Behaviors" ... >
<Entry Placeholder="Enter some text">
<Entry.Behaviors>
<local:TextValidationBehavior IsValid={Binding IsEntryValid} />
</Entry.Behaviors>
</Entry>
</ContentPage>
以下是Femil的回答的延续:
这里有一个自定义控件,用于限制字符数量,但它也可以用于任何你想使用TextChanged事件的情况:
public class CustomEntry : Entry
{
private CustomEntryParams parameters { get; set; }
public CustomEntry(CustomEntryParams customParams)
{
if (customParams.MaxLength > 0)
{
base.TextChanged += EnforceMaxLength;
parameters = customParams;
}
}
public void EnforceMaxLength(object sender, TextChangedEventArgs args)
{
Entry e = sender as Entry;
String val = e.Text;
if (val.Length > parameters.MaxLength)
{
val = val.Remove(val.Length - 1);
e.Text = val;
}
}
}
public class CustomEntryParams {
public int MaxLength { get; set; }
}
不要尝试在XAML中使用此代码,否则会收到解析器错误,而应该在代码后端使用:
new CustomEntry(new CustomEntryParams { MaxLength = 5 });
FormattedTextChangedBehavior : Behavior<Entry>
。您可以在自定义渲染器的OnElementChanged方法中设置以下过滤器
this.Control.SetFilters(new Android.Text.IInputFilter[] { new Android.Text.InputFilterLengthFilter(MaxLength)});