【发布时间】:2017-01-03 09:59:34
【问题描述】:
我有两个自定义条目:
MaxLengthEntry : EntryBannedCharactersEntry : 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。
【问题讨论】:
-
您的禁止字符检查会更改文本,然后调用编辑文本。
-
我认为可能是这样。关于我应该如何重组我的类/方法来做我想做的任何想法?
标签: c# xamarin.forms xamarin.forms.entry