在我的Xamarin Forms应用程序中,我有一个页面,其中包含用于输入文本的Entry
视图。我已将TextChanged
事件连接起来,以便在用户输入文本时UI动态更新,并且我希望更新的UI在用户按Enter键时保持不变(即Completed
事件被触发)但是如果用户退出视图(即Unfocused
事件被触发但不是Completed
事件),则恢复到之前的状态。
这里的复杂情况是 - 至少在Android上 - Xamarin首先触发Unfocused
事件(在两种情况下)和然后触发Completed
事件(仅在案例中)用户按下Enter的地方)。因此,很难确切知道何时恢复UI更改。这对我来说是违反直觉的:当我按下输入时,视图显然仍然具有焦点,因此在Unfocused
之前首先调用Completed
是没有意义的。
我尝试过的一些事情并不满意:
Unfocused
事件处理程序中,启动一个200毫秒的计时器,如果Completed
事件没有发生,那么假设它没有去并恢复用户界面(看起来不可靠,200毫秒是完全随意的。Unfocused
事件中恢复用户界面,然后重新应用Completed
事件中的更改(如果收到)(丑陋,导致用户界面闪烁,性能不佳)。Completed
则重新应用它们,或者如果在此之前收到计时器则取消计时器(获取一点复杂)。这样做的正确方法是什么?
答案 0 :(得分:1)
稍微改变你对计时器的建议。 “entryFocus”是一个条目名称。
CancellationTokenSource source;
private void EntryFocus_Completed(object sender, EventArgs e)
{
try
{
source.Cancel();
}
catch { }
}
async private void EntryFocus_Unfocused(object sender, FocusEventArgs e)
{
source = new CancellationTokenSource();
try
{
await Task.Delay(500, source.Token);
}
catch (TaskCanceledException) //completed event requested cancelation
{
return;
}
catch { } //something is wrong
entryFocus.Text = "";
}