如何检测用户何时退出文本条目而不按Xamarin表单中的输入?

时间:2017-07-25 22:23:49

标签: xamarin.forms event-handling

在我的Xamarin Forms应用程序中,我有一个页面,其中包含用于输入文本的Entry视图。我已将TextChanged事件连接起来,以便在用户输入文本时UI动态更新,并且我希望更新的UI在用户按Enter键时保持不变(即Completed事件被触发)但是如果用户退出视图(即Unfocused事件被触发但不是Completed事件),则恢复到之前的状态。

这里的复杂情况是 - 至少在Android上 - Xamarin首先触发Unfocused事件(在两种情况下)和然后触发Completed事件(仅在案例中)用户按下Enter的地方)。因此,很难确切知道何时恢复UI更改。这对我来说是违反直觉的:当我按下输入时,视图显然仍然具有焦点,因此在Unfocused之前首先调用Completed是没有意义的。

我尝试过的一些事情并不满意:

  • Unfocused事件处理程序中,启动一个200毫秒的计时器,如果Completed事件没有发生,那么假设它没有去并恢复用户界面(看起来不可靠,200毫秒是完全随意的。
  • 始终在Unfocused事件中恢复用户界面,然后重新应用Completed事件中的更改(如果收到)(丑陋,导致用户界面闪烁,性能不佳)。
  • 以上的一些组合,例如:启动计时器,然后在200ms后恢复UI更改,但如果在此之后收到Completed则重新应用它们,或者如果在此之前收到计时器则取消计时器(获取一点复杂)。

这样做的正确方法是什么?

1 个答案:

答案 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 = "";
}