IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Récupérer le contenu d'une textbox WPF dans une appli Forms


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2017
    Messages : 6
    Par défaut Récupérer le contenu d'une textbox WPF dans une appli Forms
    Bonjour,

    Ayant découvert que les textbox WPF peuvent afficher les fautes d'orthographe via la classe SpellCheck, j'ai entrepris d'essayer d'incorporer une textbox WPF dans une appli Forms, le but étant de remplacer une textbox Forms dans un programme existant.
    J'ai lu quelques articles Microsoft qui m'ont permis de voir comment ajouter un projet en WPF à la solution et pouvoir inclure le contrôle WPF dans la Form. Après divers essais infructueux, j'en suis arrivé à un programme d'essai réduit au maximum : une application Forms, avec un ElementHost qui contient le UserControl1 avec une unique textbox WPF de nom TBWpf, et un bouton Forms pour afficher le contenu de la textbox WPF. Le tout donne un code on ne peut plus simple.

    - Le code XAML du UserControl ajouté à la solution Forms, qui contient une textbox avec le texte "Textbox WPF" :
    Nom : devenv_2022-04-26_17-53-42.png
Affichages : 144
Taille : 111,1 Ko
    - La Form, avec son Usercontrol WPF et son bouton Forms :
    Nom : devenv_2022-04-26_17-54-03.png
Affichages : 126
Taille : 5,8 Ko
    - Et le code du bouton pour essayer de faire afficher le texte contenu dans la textbox :
    Nom : devenv_2022-04-26_18-02-45.png
Affichages : 145
Taille : 28,7 Ko

    Comme on peut le constater, cette ligne de Visual Basic ne peut être compilée parce que "la textbox TBWpf n'est pas déclarée". Je précise que si je remplace TBWpf par ElementHost1.TBWpf, on me dit que TBWpf n'est pas un membre de ElementHost1. Ah ! Pourtant elle est affichée et fonctionnelle quand on arrive à générer l'application en mettant en commentaire la ligne VB du bouton qui ne peut être compilée.

    Le constat que je fais est que les contrôles qui sont à l'intérieur de UserControl1 sont inaccessibles depuis la Form et son code. Comment faire alors pour récupérer (et accessoirement aussi écrire dans) le contenu de la propriété Text de la textbox WPF ?

    Cela fait longtemps que je produis des applications Forms en Visual Basic, mais je suis nouveau en WPF, donc je suppose que quelque chose de fondamental m'échappe.
    Une histoire de data binding pour faire passer les propriétés des contrôles WPF dans le monde Forms ? Je lis de la doc technique (Microsoft et autre) pour essayer de comprendre où est le problème, mais pour l'instant je sèche.

    J'aimerais beaucoup y arriver, parce la correction orthographique du contenu fonctionne très bien quand on ajoute tout simplement SpellCheck.IsEnabled="True" dans la définition XAML de la textbox, mais si je ne peux pas récupérer le texte qui y est écrit pour le traiter dans le code de la Form...

    Si quelqu'un a une idée, je suis preneur.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 978
    Par défaut
    Je ne suis pas non plus familier de WPF mais il y a certaines lois de l'informatique que tu ne peux pas contourner.
    Puisque ton contrôle TBWpf est à l'intérieur d'un UserControl, il faut passer par ce UserControl pour accéder à TBWpf

  3. #3
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2017
    Messages : 6
    Par défaut
    Bonjour Popo,

    Certes, mais comment ?

    ElementHost1.TBWpf.Text ? Refusé, "TBWpf n'est pas un membre de ElementHost1".
    UserControl1.TBWpf.Text ? Refusé, "UserControl1 n'est pas déclaré."
    WpfControlLibrary1.UserControl1.TBWpf.Text ? Refusé, "WpfControlLibrary1.UserControl1.TBWpf n'est pas accessible dans ce contexte, car il est 'Friend'." (message que je ne comprend pas).
    WpfControlLibrary1.ElementHost1.TBWpf.Text ? Refusé, ElementsHost1 n'est pas un membre de WpfControlLIbrary1."

    C'est pourquoi je me dis qu'a priori les contrôles internes au UserControl sont inaccessibles directement depuis l'appli Forms, car aucune syntaxe ne permet d'adresser la textox qui se trouve à l'intérieur (ou alors je ne l'ai pas trouvée).

    Je vais essayer d'aller voir à quoi rime ce "Friend" et ses implications...

    Et sinon il faudra certainement mettre en place une routine publique dans le UserControl qui permette de faire sortir le contenu de la textbox vers le monde extérieur.

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 978
    Par défaut
    Friend signifie simplement que l'élément est accessible uniquement à partir de l’assembly qui contient le contient.

    Ce n'est pas une bonne idée de changer Friend en Public
    Je ne suis pas certain que tu puisses le faire que c'est la traduction en code VB de ton nœud <TextBox>

    La bonne méthode est celle décrite ici :
    https://docs.microsoft.com/en-us/dot...orkdesktop-4.8

  5. #5
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2017
    Messages : 6
    Par défaut
    On est d'accord, le Friend a été généré automatiquement par Visual Studio dans le code de fabrication de la Form, donc pas la peine d'essayer de le changer.

    Je vais me baser sur l'exemple présent dans le lien que tu m'as indiqué. J'espérais ne pas avoir à passer par là pour récupérer le simple contenu d'une textbox, mais visiblement on n'a pas le choix.
    Il va me rester à passer du C# de l'exemple en Visual Basic. Je devrais m'en sortir...

    Merci pour ton aide.
    Je posterai ici le code nécessaire pour faire marcher l'exemple minimal que j'ai montré, cela servira peut-être à d'autres plus tard.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2017
    Messages : 6
    Par défaut
    Finalement j'ai trouvé une solution en m'inspirant plus ou moins de tutoriels trouvés dans la nature.

    Durant la génération de cet exemple minimal, il est créé un fichier UserControl1.xaml.vb qui permet de mettre du code à exécuter par le contrôle WPF.
    Le contrôle n'ayant rien à faire, ce fichier est quasi vide et ne contient rien d'autre que la définition de la classe UserControl1 :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Class UserControl1
     
    End Class

    J'y ai ajouté la définition d'une nouvelle textbox de nom twpf, cette fois publique, et j'ai créé une routine d'initialisation qui donne à cette texbox le même contenu que celle qui m'intéresse, à savoir TBWpf :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Class UserControl1
        Public twpf As TextBox
     
        Public Sub Uc1Init()
            twpf = TBWpf
        End Sub
     
    End Class

    Ensuite dans le code de la Form1, Form1.vb, j'ai créé le callback appelé lors du chargement initial de celle-ci (Form1_Load) et j'y ai collé l'appel à Uc1Init() pour initialiser la textbox publique twpf.
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        UserControl11.Uc1Init()
    End Sub

    À partir de là, le contenu de la textbox TBWpf devient accessible depuis Form1.vb via la textbox publique twpf :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        MessageBox.Show("Texte Textbox WPF = " + UserControl11.twpf.Text)
        UserControl11.twpf.Text = "Texte WPF modifié"
    End Sub
    La première ligne affiche bien le contenu de la textbox :

    Nom : TestSimpleTBWpf_2022-04-28_00-30-40.png
Affichages : 112
Taille : 8,8 Ko

    et la deuxième permet bien d'en changer le contenu :

    Nom : TestSimpleTBWpf_2022-04-28_00-31-03.png
Affichages : 120
Taille : 6,3 Ko

    Voilà. Je ne sais pas si cette technique est conventionnelle dans ce contexte, elle est peut-être un peu bourrin, mais elle fonctionne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/10/2014, 11h33
  2. Récupérer le contenu d'un fichier texte dans une variable
    Par heureactuelle dans le forum MATLAB
    Réponses: 2
    Dernier message: 17/05/2008, 15h10
  3. Réponses: 7
    Dernier message: 12/06/2007, 14h59
  4. Réponses: 2
    Dernier message: 29/05/2007, 14h56
  5. Comment récupérer le contenu d'une URL dans une variable ?
    Par Fildz dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/08/2006, 09h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo