【发布时间】:2018-11-25 10:38:45
【问题描述】:
在我的表单上,我有 3 个 entry 控件。我正在尝试使用以下验证规则验证“年龄”控件:
不能输入超过 3 位数字
无法输入小数位 (.)
无法输入连字符 (-)
为此,我将控件的“TextChanged”属性设置为
TextChanged="OnAgeTextChanged"
我的OnAgeTextChanged方法是:
private void OnAgeTextChanged(object sender, TextChangedEventArgs e)
{
var entry = (Entry)sender;
try
{
if (entry.Text.Length > 3)
{
string entryText = entry.Text;
entry.TextChanged -= OnAgeTextChanged;
entry.Text = e.OldTextValue;
entry.TextChanged += OnAgeTextChanged;
}
string strName = entry.Text;
if (strName.Contains(".") || strName.Contains("-"))
{
strName = strName.Replace(".", "").Replace("-", "");
entry.Text = strName;
}
}
catch(Exception ex)
{
Console.WriteLine("Exception caught: {0}", ex);
}
}
但是,当满足if条件时,事件会被循环多次,导致应用程序运行缓慢。
例如,如果我输入我的年龄为 1234,它会多次循环代码,因此会有延迟,每次更改文本时延迟都会增加。
还有什么其他方法可以实现此验证,但不会多次调用事件?
编辑
在更新代码以删除我的控件上的TextChanged 触发器之后,然后在方法结束时重新分配它,它仍然循环多次,并且循环次数随着每次按键而增加。
入口控制xaml
<Entry x:Name="txtAge"
Placeholder="Age"
Keyboard="Numeric"
TextColor="DarkBlue"
PlaceholderColor="DarkBlue"
Completed="AgeCompleted"
HorizontalOptions="Start"
WidthRequest="55"
TextChanged="OnAgeTextChanged"
/>
TextChanged事件
private void OnAgeTextChanged(object sender, TextChangedEventArgs e)
{
var entry = (Entry)sender;
try
{
entry.TextChanged -= OnAgeTextChanged;
if (entry.Text.Length > 3)
{
entry.Text = e.OldTextValue;
}
string strName = entry.Text;
if (strName.Contains(".") || strName.Contains("-"))
{
strName = strName.Replace(".", "").Replace("-", "");
entry.Text = strName;
}
}
catch(Exception ex)
{
Console.WriteLine("Exception caught: {0}", ex);
}
finally
{
entry.TextChanged += OnAgeTextChanged;
}
}
【问题讨论】:
-
那是因为当你设置
entry.TextOnAgeTextChanged会被再次调用。我的建议是将您的验证更改为entry.Unfocused,当用户应该完成编辑文本时,或者您可以在方法开始时取消订阅您对OnAgeTextChanged的条目,然后在结束时设置所有文本重新订阅方法。 -
@Nick 我将如何做第二个?我知道在 vb.NET 中我可以使用
RemoveHandler,但是在 c# 中如何实现呢? -
您已经在方法中将
entry.TextChanged -= OnAgeTextChanged;移动到 try 的开头,并且可能在 catch 之后添加 finally 并将entry.TextChanged += OnAgeTextChanged;移动到那里。 -
@Nick 嗯,照你说的做之后还是会循环多次
-
老实说,我会删除事件取消订阅和订阅事件('entry.TextChanged += OnAgeTextChanged;'),它们不会像您认为的那样工作,无论如何在这种情况下都不会。
标签: c# android xamarin xamarin.forms logic