none
TextBox.TextChanged non déclenché RRS feed

  • Discussion générale

  • Bonsoir,

    je rencontre un problème assez gênant avec l'événement TextChanged d'une TextBox dans une application Windows Store développée en VB.NET. Je dis dans le titre qu'il ne se déclenche pas, mais en réalité il ne se déclenche pas quand je veux.

    En effet, je dois effectuer une action avec le dernier caractère du texte de cette TextBox quand son contenu est changé, il est donc important que l'événement se déclenche à chaque fois qu'un caractère est ajouté. A l'appui sur une touche du clavier je gère donc l'événement KeyDown (sachant que la TextBox n'accepte que des lettres majuscules) :

    MaTextBox.Text = MaTextBox.Text & e.Key.ToString

    Ceci fonctionne, mais si je veux insérer plusieurs caractères, le contenu du presse-papiers par exemple, je passe par un For et j'ajoute un par un les caractères du texte, or là l'événement ne se déclenche que quand je sors de la boucle For est non à chaque ajout de caractère... (il se déclenche d'ailleurs autant de fois que j'ai ajouté de caractère, c'est à n'y rien comprendre).

    For Each Lettre as Char in PressePapiers MaTextBox.Text = MaTextBox.Text & Lettre Next

    MaTextBox.TextChanged gère donc plusieurs fois le dernier caractère, au lieu de les faire les uns après les autres.

    Le même code dans une application Windows Form ne pose pas de problème. J'utilise par contre la fonction AppendText qui n'existe pas pour les applications Windows Store, je ne vois pas pourquoi...

    Merci à ceux qui pourront m'aider à résoudre cela :)

    • Type modifié Aurel Bera lundi 31 mars 2014 08:21 disc
    mercredi 19 mars 2014 18:48

Toutes les réponses

  • Bonjour,

    Le code de la boucle sur le contenu du presse papier est il dans la méthode qui traite l'événement TextChanged ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    mercredi 19 mars 2014 22:39
    Modérateur
  • Bonsoir,

    merci de demander, car je n'ai pas précisé. Non, l'ajout des caractères un par un se fait simplement au clic d'un bouton "Coller" dans une CommandBar. La boucle For est dans la méthode de l'événement Click de ce bouton.

    J'ai aussi testé avec un simple bouton qui ajoute "A", puis "B", puis "C", la boucle For fait son travail, et ce n'est qu'après que l'événement TexteChanged est déclenché trois fois de suite. Encore une fois, le même code dans un WindowsForm ne pose aucun problème.

    Je pense qu'il doit y avoir une solution en utilisant une autre méthode, mais je n'en vois aucune qui pourrait résoudre ce problème.

    Merci d'essayer de m'aider.

    jeudi 20 mars 2014 19:31
  • Bonjour,

    Je n'ai pas connaissance de ce problème, mais la bonne pratique lorsque l'on fait du WPF est d'utiliser le pattern MVVM qui consiste à binder votre TextBox dans une propriété de type String.

    Ensuite il faut mettre l'option "PropertyChanged" (http://msdn.microsoft.com/en-us/library/system.windows.data.updatesourcetrigger.aspx) au niveau du Binding pour actualiser la propriété bindé à chaque changement de la propriété Text.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    vendredi 21 mars 2014 00:16
    Modérateur
  • Bonjour,

    alors voilà ce que j'ai essayé de faire :

    j'ai créé un String comme contexte de données DataContext et que je modifie au lieu de modifier directement MaTextBox.Text. Par la suite, j'ai lié la propriété Text de la TextBox au DataContext et j'ai mis PropertyChanged au UpdateSourceTrigger.

    Cependant, le problème posé est toujours le même : en modifiant le DataContext, le contenu de la TextBox change, mais l'événement TextChanged n'est appelé qu'à la fin de l'instruction dans laquelle le texte change. Donc si je modifie le texte en ajoutant les caractères un par un, TextChanged n'est pas appelé à chaque fois, mais à la fin... Je ne vois pas quel événement il faut que je gère.

    Je ne maîtrise pas du tout ces liaisons de données dans tous les sens pour les applications du Windows Store, c'est pour ça que je changeait moi même le contenu de la TextBox. De plus, le DataContext ne contient qu'une valeur, comment fait-on si on a plusieurs TextBox et qu'on veut les lier à d'autres propriétés par exemple ?

    Merci.

    samedi 22 mars 2014 10:13
  • Bonjour

    Voir la réponse dans ce thread .

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 24 mars 2014 06:42