2017-07-25 5 views
0

Dans mon application Xamarin Forms, j'ai une page avec une vue Entry pour saisir du texte. J'ai câblé l'événement TextChanged pour que l'interface utilisateur mette à jour dynamiquement lorsque l'utilisateur saisit du texte, et je souhaite que l'interface utilisateur mise à jour persiste si l'utilisateur appuie sur Entrée (l'événement Completed est déclenché), mais revenir à la précédente. l'utilisateur revient en arrière de la vue (l'événement Unfocused est déclenché mais pas l'événement Completed).Comment détecter quand l'utilisateur sauvegarde une entrée de texte sans appuyer sur Entrée dans Xamarin Forms?

La complication est que - au moins sur Android - Xamarin déclenche l'événement Unfocused premier (dans les deux cas) et puis l'événement Completed (uniquement dans le cas où l'utilisateur presse entrent). Il est donc difficile de savoir exactement quand annuler les modifications de l'interface utilisateur. Ceci est contre-intuitif pour moi: quand j'appuie sur enter, la vue a toujours le focus, donc ça n'a pas de sens que Unfocused soit appelé avant le Completed.

Certaines choses que j'ai essayé et ne suis pas satisfait:

  • A l'intérieur du gestionnaire d'événements Unfocused, démarrez une minuterie pour 200ms, et si l'événement Completed n'a pas eu lieu alors supposer qu'il ne va pas et inverser l'interface utilisateur (ne semble pas fiable, 200ms est totalement arbitraire).
  • Toujours rétablir l'interface utilisateur à l'intérieur de l'événement Unfocused, puis réappliquer les modifications dans l'événement Completed s'il est reçu (laid, provoque l'interface utilisateur à scintiller, mauvaise performance). Une combinaison de ce qui précède, par exemple: démarrer une minuterie, puis inverser les changements d'interface utilisateur après 200ms, mais les réappliquer si Completed est reçu après cela ou annuler le minuteur s'il est reçu avant (devient un peu compliqué).

Quelle est la bonne façon de faire cela? Changement de votre suggestion de minuterie un peu plus.

+1

[Un problème similaire] (https://forums.xamarin.com/discussion/87705/switching-focus-is-broken-in-entry-completed-event-handler). Mais je ne pense pas qu'il a une solution appropriée – Curiousity

+1

[Cette solution] (https://stackoverflow.com/a/41521517/7196681), [this] (https://forums.xamarin.com/discussion/55183/ done-button-not-firing-complete-event-on-entry) et [this] (https://stackoverflow.com/a/39582265/7196681) peuvent être utiles – Curiousity

Répondre

1

"entryFocus" est un nom d'entrée.

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