我有两个自定义条目:
MaxLengthEntry : Entry
BannedCharactersEntry : MaxLengthEntry
问题是当用户输入一个允许的字符并且超过了条目的最大长度时,就会发生无限循环。
BannedCharactersEntry
像这样添加到 XAML 中:
<local:BannedCharactersEntry BannedCharacters="369" Text="1" Keyboard="Numeric" MaxLength="1" />
MaxLengthEntry类:
class MaxLengthEntry : Entry
{
public MaxLengthEntry()
{
base.TextChanged += EditText;
}
public virtual 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;
Debug.WriteLine("MAX: " + val);
}
public static readonly BindableProperty UppercaseProperty = BindableProperty.Create<MaxLengthEntry, bool>(p => p.Uppercase, false);
public bool Uppercase
{
get
{
return (bool)GetValue(UppercaseProperty);
}
set
{
SetValue(UppercaseProperty, value);
}
}
public static readonly BindableProperty MaxLengthProperty = BindableProperty.Create<MaxLengthEntry, int>(p => p.MaxLength, 0);
public int MaxLength
{
get
{
return (int)GetValue(MaxLengthProperty);
}
set
{
SetValue(MaxLengthProperty, value);
}
}
}
BannedCharactersEntry类:
class BannedCharactersEntry : MaxLengthEntry
{
public static readonly BindableProperty BannedCharactersProperty =
BindableProperty.Create("BannedCharacters", typeof(string), typeof(BannedCharactersEntry), null);
public string BannedCharacters
{
get { return (string)GetValue(BannedCharactersProperty); }
set { SetValue(BannedCharactersProperty, value); }
}
public BannedCharactersEntry() : base()
{
}
public override void EditText(object sender, TextChangedEventArgs args)
{
base.EditText(sender, args);
Entry e = sender as Entry;
String val = e.Text;
Debug.WriteLine("BANNED: " + val);
if (string.IsNullOrEmpty(val))
return;
foreach (char c in BannedCharacters)
{
if (val[val.Length - 1] == c)
{
val = val.Remove(val.Length - 1);
break;
}
}
e.Text = val;
}
}
BannedCharactersEntry 的初始值为 1。然后我按 2。
输出如下所示:
最大:1 禁止:12
最大:1 禁止:1
最大:1 禁止:12
最大:1 禁止:1
等等...
我不知道为什么EditText
不断调用该方法或为什么BANNED输出为 12。