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)
小智 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)
Entry控件中似乎没有内置属性来限制字符/长度。您可以通过以下两种可用方法之一完成文本限制和字符输入:-
是的 - 您可以直接从Entry派生来创建您自己的派生,然后进一步自定义它,例如挂钩到TextChanged事件处理程序。没有按键处理程序,因此您必须对传递到e.NewTextValue的完整值进行有效性检查。如果新条目与您的要求不匹配,您只需设置.Text=e.OldTextValue即可恢复到最后一个有效条目。
如果您想挂钩每个平台本机控件的事件处理程序,您可以编写自己的自定义渲染器控件以进行更精细的控制。