2017-07-25 12 views
0

私のXamarin Formsアプリには、テキストを入力するためのEntryビューのページがあります。 TextChangedイベントを配線して、ユーザーがテキストを入力するときにUIが動的に更新されるようにしました。ユーザーがEnterを押した場合(つまり、Completedイベントが発生した場合)、更新されたUIを保持します。ユーザーはビューから脱退します(つまり、Unfocusedイベントがトリガーされますが、Completedイベントはトリガーされません)。少なくともAndroidの - - Xamarin次いでCompletedイベント(のみユーザがEnterキーを押す場合)(両方の場合において)最初Unfocusedイベントをトリガし、ここXamarinフォームでEnterキーを押さずにユーザーがテキスト入力を取り消したときを検出するにはどうすればよいですか?

合併症ということです。したがって、UIの変更を元に戻すタイミングを正確に知ることは難しいです。これは私にとっては直感的ではありません。私がEnterを押すと明らかにまだフォーカスがあるので、Completedより先にUnfocusedを最初に呼び出すことは意味がありません。

私が試したと満足していないてきたいくつかの点:

  • Unfocusedイベントハンドラの内部では、200msの間タイマーを開始し、Completedイベントは、その後で起きていない場合は、それがないだろうと仮定UIを元に戻す(信頼できるとは思われませんが、200msは完全に任意です)。
  • Unfocusedイベント内のUIを常に元に戻してから、Completedイベントの変更を再適用してください(醜いですが、UIがちらつき、パフォーマンスが悪くなります)。
  • 上記のいくつかの組み合わせ:たとえば、タイマーを開始してから200ms後にUIの変更を元に戻してから、Completedが受信された場合は再適用するか、それ以前に受信した場合はタイマーをキャンセルします。

これを行うには適切な方法はありますか?

+1

【同様の問題(https://forums.xamarin.com/discussion/87705/switching-focus-is-broken-in-entry-completed-event-handler)。しかし、私はそれが適切な解決策を持っているとは思わない – Curiousity

+1

[This solution](https://stackoverflow.com/a/41521517/7196681)、[this](https://forums.xamarin.com/discussion/55183/)完了ボタンが押されていないことを示しています)と[this](https://stackoverflow.com/a/39582265/7196681)が役に立ちます – Curiousity

答えて

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 = ""; 
} 
関連する問題