0
votes

WPF Textbox ne lancera pas l'événement TextInput

J'ai une fenêtre avec une zone de texte qui ne jette pas des événements TextInput lors de la frappe.

Je l'ai regardé avec Snooper. Seuls les événements de clé et de porte-clés sont lancés.

 Capture d'écran de Snooper Résultats lors de la frappe

It est répondant à quelques clés: espace, arrière-plan, insert, home, suppression, fin

Il répond aux commandes de copie et coller, ainsi que de sélectionner tout

Il ne répond pas à aucun caractère, symbole ou Numéro

et voici le kicker: Cette fenêtre est ouverte via une méthode partagée appelée à partir de deux endroits différents du code. Lorsque cela est appelé à partir d'un endroit, la zone de texte fonctionne parfaitement, lorsque cela est appelé depuis autre lieu, il ne le fait pas.

J'ai exclu une liaison, convertisseurs de données, styles, emplacement de contrôle. J'ai dépouillé la fenêtre jusqu'à une seule zone de texte simple sans reliures, et le problème persiste.

J'ai essayé tout ce que je peux penser à suivre ce bug mystérieux. Je ne vois pas ce qui pourrait gérer mon événement avant que le prévisionnantTextinNUT ne soit même pas à jeter, ou pourquoi cela pourrait ne pas se produire que la moitié du temps.

Toutes les idées sur la cause de ce bogue, ou D'autres outils que je pourrais essayer de tracer les événements seraient grandement appréciés!

EDIT: Ajout du code à démontrer. Cela a été dépouillé jusqu'au code de Barrest requis et le problème est toujours survenant. xxx

remarque le manque de fixations, de styles ou de quoi que ce soit d'autre qui peut interférer le contrôle xxx

Il s'agit de la classe statique qui construit la fenêtre. Les deux appels distincts de cette classe construisent les arguments différemment. J'ai supprimé le code qui utilise les arguments pour montrer qu'ils n'affectent pas le problème à la main. xxx

La seule autre chose que je peux ajouter est que le code appelant Le spectacle () SUB provient de deux solutions distinctes. Je ne sais pas quel impact qui pourrait éventuellement avoir après avoir supprimé tous les arguments

edit 2: J'ai essayé de retracer la séquence d'événements pour affiner où l'événement est manipulé. Jusqu'à présent, je peux voir qu'entre les événements de la clé et des porte-clés, il existe une séquence d'événements qui devraient se produire ne sont pas:

  • PreviewInputReport / INPUTREPORT (pas source)
  • PrévisualisationTextInpuTstart / TextInpuTstart (TextBox)
  • PreviewExtInput / TextInput (Textbox)
  • PreviewInputReport / INPUTREPORT (TEXTBOXVIEW)

    L'événement de la clé n'est pas manipulé, donc je ne sais pas pourquoi la prévisualisationInputReport ne se fait pas tirer


14 commentaires

Veuillez poster un code pertinent et un petit échantillon afin que nous puissions vous aider et afin que nous puissions essayer de reproduire la question; Vous devriez le savoir en étant maintenant membre de 10 ans et plus :)


"Lorsqu'il est ouvert à la mode, la zone de texte fonctionne parfaitement, lors de l'ouverture de l'autre côté, ce n'est pas le cas." Ahh, l'une manière. Mais l'inverse? Bonne lecture.


@ Çöđěxěŕŕ J'ai ajouté le code, au cas où vous ne saviez pas quelle fenêtre ne contenant que une zone de texte ressemble ...;)


@Shaboboo fourni le code n'est pas suffisant pour déboguer le problème. Est-il possible pour vous de créer une solution avec une question reproductible et de le partager quelque part, peut être Github?


@Dipenshah, je ne m'attends pas à ce que vous puissiez reproduire ou déboguer cette question. Je demande des idées sur la façon de déboguer cela plus loin. Si vous avez eu mon code quelle approche prendriez-vous pour trouver le problème? J'ai essayé Spoof WPF, mais tout ce qui était capable de me montrer était que l'événement ne se lance pas. Comment puis-je savoir pourquoi?


@Shaboboo Je suggérerais de télécharger des symboles de débogage à partir de .NET Framework et de commencer depuis le fond.


Avez-vous regardé dans le TEXTBOXBASE.ONPREVIEWIEWNODOWDOWDOWN ? Aussi avez-vous lu la section des remarques sur l'utilisation de l'événement PreviewEtextinPUT ici


Si vous voulez quelques idées, voici une idée du sommet de ma tête - vous avez peut-être une fenêtre globale dans l'une des solutions qui gère cet événement? Essayez de définir w.style = nouveau style dans votre Afficher la méthode .


@ Çöđěxěŕ L'ONPREVIEVIEDYDOWDOWDOWDDOWDDOWDDOWS, mais l'événement PreviewExtInput n'est pas. Toute idée qui pourrait interrompre la chaîne d'événement et arrêter les événements de prévisualisationTextInput / TextInput de se faire tirer?


@Shaboboo Pas à ce moment-là, je ne le fais pas, mais dans le lien I Publié la section des remarques contient ceci: Plusieurs événements clés peuvent augmenter un événement d'entrée de texte qui peut être le problème que vous rencontrez.


Mais si une touche appuyez sur une touche de saisie d'un événement d'entrée, vous pouvez être assuré que plusieurs pressions de touches n'entraîneront même qu'un événement d'entrée. Comme je l'ai dit ci-dessus, il suffit de répondre à des clés spécifiques, telles que l'espace et l'espace arrière, la maison et la fin. Il ne jette pas le prévisionnantTextInput ou TextInput tout en appuyant sur une lettre, un symbole ou un caractère. (uniquement lorsque la fenêtre est ouverte est appelée à partir d'un emplacement dans le code). Merci pour la pensée!


Recherchez des gestionnaires d'événements globaux tels que EventManager.registerClasshandler (typeof (TextOfbox), Uielement.PreviewtextNuTevent, ...) et / ou Comportements. Utilisez-vous une bibliothèque d'interface utilisateur tierce? Regarde aussi leur code aussi.


@ Grx70 Merci pour l'idée, je l'ai essayé sur la fenêtre et la zone de texte elle-même, il semble que les styles ne sont pas le problème ici. Une autre chose exclue!


@ L33T J'ai vérifié à fond de mon code et il n'y a pas de gestionnaires d'événements mondiaux qui s'inscrivent à cet événement. Nous n'utilisons pas non plus de bibliothèques tierces.


5 Réponses :


0
votes

Le problème est que, alors que le TextInput n'est pas tiré (non lancé ... des exceptions sont lancées), vous ne le voyez pas parce que la zone de texte elle-même utilise. Pour attraper cet événement, vous devez utiliser le prévisionneurTextInput. Donc, par exemple xxx

avec des gestionnaires d'événements ... xxx

Le premier gestionnaire n'est jamais appelé, le second toujours.


3 commentaires

Le problème est que l'aperçu de TextInput Event n'est pas aussi lancé. Nous ne voyons que les événements de clé et de porte-clés. Quelque chose interrompt la chaîne d'événement avant que l'événement de prévisualisation soit lancé


* tiré, non lancé, désolé


Je n'ai jamais vu une situation où PreviewExtInput ne fonctionne pas. Mettre dans le gestionnaire d'événements. Ça va marcher. Ne comptez pas sur vos outils. Ils vous disent la mauvaise histoire. Si vous commencez simplement frais ... en utilisant le code que vous avez posté ... cela fonctionnera. Maintenant, si cela ne fonctionne toujours pas dans votre application cible, cela signifie que le problème est dans le code que vous n'avez pas posté et que je ne peux ni aucun autre ne peut vous aider.,



2
votes

Disclaimer

Je posterai C # code parce que je ne parle pas assez dans vb pour écrire du code (uniquement pour le lire dans une portée limitée). Je vais essayer de le traduire si je trouve un peu de temps, ou quelqu'un d'entre vous peut vous sentir libre de le faire.


J'ai réussi à reproduire le comportement que vous avez décrit en manipulant le PreviewEtextinPut Événement dans l'arborescence visual de la fenêtre (rappelez-vous qu'il est un événement routé de tunneling): xxx xxx

donc à mon avis c'est un fort suspect pour la cause de vos problèmes. Il explique également Le commentaire à la réponse de @ Aquirky que votre < Code> PreviewTextInput Le gestionnaire n'est pas appelé. Vous pouvez confirmer que c'est le cas en s'abonnant différemment (le gestionnaire est appelé même si l'événement était marqué comme manipulé): xxx

si cela s'avère être un diagnostic correct, puis Il y a une chose quelque peu mystérieuse - qui et où gère l'événement previewExtInput ? Je suppose que c'est pour vous d'enquêter ...

Ce commentaire de @ l33t pourrait être utile:

Rechercher des gestionnaires d'événements globaux tels que EventManager.registerClasshandler (typeof (Textbox), uielement.previewtextNuTevent, ...) et / ou comportements. Utilisez-vous une bibliothèque d'interface utilisateur tierce? Regarde aussi leur code.

update

car il semble que prévisionneurTextInput n'est pas le coupable après tout, voici ce que je ferais ensuite. < P> Si je ne me trompe pas, il y a une chaîne d'événements entière étant tirée avant TextInDeVent , et je crois que la manipulation de ceux-ci peut casser la chaîne. Il ressemble également à INPUTMANAGER est responsable de la gestion de ce cycle d'événement (vous pouvez inspecter son C # code source ICI ).

QU'IL SIGNENT QUE JE SUITE QUE Je suggère de faire ce qui suit:

  1. Utilisation de INPUTMANAGER.CURRENT S'abonner à son Préprocessinput PostProcessInput Evénements (éventuellement PRENotifyInput et < Code> PostNotifyInput )
  2. Enregistrez la chaîne d'événements dans le scénario de travail (surtout inspecter les arguments ' stagingitem.input.routeDevent , qui détient l'événement routé en cours de traitement)
  3. Répétez la procédure pour le scénario de non fonctionnement
  4. Pointez la première différence - le premier événement routé étant traité dans le scénario de travail, mais ne pas être traité dans le scénario de non-fonctionnement
  5. étudie à la fois un dernier événement routé commun et le premier qui est différent - peut-être l'un de ceux-ci est traité dans votre code?


9 commentaires

Donc, je mets des gestionnaires de prévisualisationTexter à tous les niveaux de l'arbre visuel. Lorsque j'ouvre la fenêtre de l'appel qui fonctionne, je peux voir que l'événement acheminez la touche de la fenêtre dans la zone de texte. Lorsque j'ouvre la fenêtre de l'endroit qui ne fonctionne pas, l'événement PreventeTextInput ne tire pas à aucun niveau. Note latérale intéressante; Le bouton SPACE ne déclenche pas l'événement PreviewExtInput dans un seul scénario, mais fonctionne pour insérer un espace dans les deux.


Pourriez-vous clarifier exactement quels scénarios causent quels résultats? Si vous vous abonnez à la section PreviewExtInput à l'aide de Cette surcharge addhandler et il n'est pas invoqué, il y a quelque chose de vraiment étrange sur votre code ou que vous avez vraiment un bogue dans votre code. cadre.


Juste une liste de contrôle rapide: 1) Vous ajoutez le gestionnaire à la zone de texte à l'intérieur de la fenêtre enfant 2) Vous appelez le addhandler relève . Est-ce exact?


Désolé, excusez le commentaire plus tôt, je n'avais pas terminé de tester correctement votre gestionnaire, qui fonctionne comme prévu. Ce handleDeventStoo est merveilleux, merci. Toujours débogage!


Je peux confirmer le gestionnaire avec HandleDeventoToo fonctionne parfaitement dans le boîtier de travail, mais dans le cas de Workbox_PreviewtextinPUT Thingbox_previewtextinPUT ne s'appelle pas. Je vais essayer d'attacher ce gestionnaire plus haut sur l'arbre visuel suivant


Essayé le gestionnaire de prévisualisationTextInput avec HandleDeventtoTOO sur la fenêtre elle-même, il ne s'appelle pas du tout dans le scénario sans travail


Qu'en est-il de PrévisualisationTextInputStart événement? Mon intuition est que cet événement est viré d'abord, et s'il est manipulé, empêche le déclenchement du PreviewExtInput , mais je n'ai aucun moyen de le confirmer en ce moment car je n'ai pas accès à un ordinateur avec VS installé. .


PreviewExtExtInpuTstart Le gestionnaire d'événements ne s'appelle pas non plus dans la version qui ne fonctionne pas non plus. (fonctionne dans la version de travail)


Merci pour la réponse mise à jour. Je suis en train de peigner à travers tous les événements maintenant, la seule différence que j'ai remarquée jusqu'à présent est la source originale de certains événements. Je vous donne la prime d'être si utile jusqu'à présent



1
votes

Dans ce cas, il s'est avéré que la forme qui a lancé la fenêtre dans le cas non de travail était une winform. Le WinForm bloquait les frappes de frappe. Ceci a été corrigé en ouvrant la fenêtre comme un modal.


0 commentaires

0
votes

Votre gestionnaire n'est pas appelé parce que d'autres gestionnaires ont marqué l'événement comme manipulé. Vous pouvez ajouter un gestionnaire avec addhandler () et passer true pour le troisième argument: xxx


0 commentaires

0
votes

J'ai eu le même problème ici. La différence entre les deux appels était la suivante: une fois que les fenêtres WPF s'appelaient modal (Works) et une fois non Modal (ne fonctionnent pas), à chaque fois qu'une fenêtre Windowsforms.

comme Shaboboo a écrit dans son anwer, c'est la différence, mais quoi, si vous devez appeler non-Modal. La réponse est donnée à ce Fil . (Stupide Me, j'ai eu le même problème il y a 2 ans, posé et a eu une réponse). Nous devons utiliser P>

ElementHost.EnableModelessKeyboardInterop(wpfWindow);


0 commentaires