none
COMMENT ACCEDER A UN CONTROL PERSO A PARTIR DU CODE D' UNE CLASS WINDOWS 1 DEPUIS CLASS WINDOWS 2 RRS feed

  • Question

  • S@lut ,
    bon le fait est que sous visual basic dans un projet windowsform  un control perso placé dans un form1 est accèssible depuis un Form2  directement en ecrivant le code  dans Form2
    ex:

    Form1.control_perso.textbox 
    
    
    
    

    dans un projet WPF en C# ca ne fonctionne pas cette écriture
     comment procéder pour accéder a ce control  ou a d' autres controls ou class d' une autre fenêtre windows en général .

    Les controls sont des controls perso issu d' une dll  il doivent être connectés entre eux pour intéragir  mais sont placés dans des fenêtres différentes.
    en Visual Basic projet WindowsForm  ca n' a posé aucun problème, ils étaient simplement accessible depuis la class Form dans lequel ils se trouvaient en ecrivant

    exemple  code dans  Form1   qui connecte les controls  placés dans Fmpayer,Fmessage etc..  

    Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadDim ComposantCom = New Cutil.NetWorkManager_ADV_.NetworkManagerADV()

     Dim DesignMessage = New Cutil.Chat.ChatControl()

    ComposantCom.Video = Fmplayer.MediaControl1
    ComposantCom.Audio = Fmplayer.MediaControl1

     

    Public

    en WPF, ca ne fonctionnait plus  cette écriture il fallait  ecrire
    exemple 
    ComposantCom.Video = My.windows.ControlVideo    la le control est accessible 
    
    
    
    

    alors que si on veut écrire
    ComposantCom.Video = Fmplayer.ControlVideo
    
    
     
    Chatcontrol1 n' est plus accesible par cette écriture
    pourtant windows1 est  la class qui contient le control
    mais après on tombe sur les propriétés seulement de la class ,
    pourquoi ?

    pour finir ce qui m' interesse  pour ce post en WPF visual C# pas possible aussi de passer par du code genre:
    windows1.control_perso 
    
    
    
    

    si on code  depuis windows2, la aussi tombe sur propriétés de la class   pourquoi ? 
    je trouve pas c ptète un truc du genre :

    my.windows etc...

    c pas une histoire de porté public privé ?

    pour résumer mon problème dans un projet WPF en C# j ai crée un  WindowsNetwork.xaml , WindowsChat .xaml,windowsImage.xaml et windowsVideo.xaml   dans lesquels j ai placé des controls_perso différents mais qui fonctionnent  ensembles  d' ou le besoin de les interconnecter entre eux.

    Donc dans WindowsNetwork.xaml
     jai mon module nomé Networkmanager1 qui va interconnecter les différents control_ modules només Chatcontrol1, ControlImage1, ControlVideo1 qui seront placés dans des fenêtres différentes 
    Cesfenêtre ne sont pas crées des le départ  lors de l' execution du programme. seul la fenêtre  networkmanager sera lancé.
    Donc moi je voulais écrire ca mais c pas bon 
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using WpfLiveCom; using WpfComposant; namespace WpfLiveCom {
    public partial class WindowsNetwork : Window { public WindowsNetwork() { InitializeComponent(); WpfComposant.NetWorkManager network = netWorkManager1; netWorkManager1.Chat = WindowsChat.chatcontrol1; //impossible atteindre chatcontrol1 netWorkManager1.Image = WindowsImage.ControlImage1;//impossible atteindre ControlImage1 etc... }
    Bon j arrête la pour les infos je tourne en rond ,merci d AV pour réponse
    • Modifié Dragonix jeudi 28 janvier 2010 01:15
    mercredi 27 janvier 2010 12:37

Réponses

  • Bonjour et merci , bon à force de chercher à comprendre vos remarques merci Gille ,qui je l' avoue étaient en rapport avec mon problème.

    mais aveuglé par le fait d' avoir déja essayé de créer une instance pour résoudre ce problème  mais sans succès pour la raison expliqué après je ne comprenais pas vos remarques, parcourant le forum de long en large pour tomber sur mon fameux problème

    http://social.msdn.microsoft.com/Forums/fr-FR/visualcsharpfr/thread/8bac02c7-5dd3-4ccf-9117-e702bbe6a8e9

    et voila  résolu
    donc du coup j' ai fais la mêmê erreur  en pensant que c' était le type  system.windows qu' on déclarait pour l'instance à créer  au lieu du type de fenêtre de la windows qui héberge le control
    du coup

    Fchat InstanceFchat = new Fchat ();c'est ok          // au lieu de  : Windows.InstanceFchat = new Fchat()
    netWorkManager1.Chat = InstanceFchat.chatcontrol1; // c' est ok chatcontrol1 est proposé par Intellicense


    j' ai tellement essayé de choses, le principal c que je sois débloqué

    donc du coup Question
    si j' ai besoin d' accéder a un control de Fchat ou autre d' afficher cette fenêtre de la fermer et la réouvrir sachant que certaines données doivent persister dans cette fenêtre
    je dois toujours utiliser cett instance  IFchat maintenant

    • Marqué comme réponse Dragonix samedi 30 janvier 2010 13:00
    samedi 30 janvier 2010 12:50

Toutes les réponses

  • Bonjour,

    J'ai pas tout compris à ce que tu voulais, si ce n'est à la fin.
    Tu voudrais pouvoir accéder à des objets qui ne sont pas encore créés.
    Ca, ce n'est malheureusement pas possible.

    Par contre, ce que je peux te conseiller, c'est lors du lancement de ton application, de créer une instance de chacun de tes écrans avec tes composants, sans les afficher.
    Comme cela, lorsque tu lances ton Manager, les objets existent, et tu peux donc les rattacher à ton manager.
    Enfin lorsque tu appelles ton écran pour le créer, tu as fait une méthode static GetInstance() sur tes fenêtres qui te renvoie l'instance créée au départ.

    Par contre, plutôt que de les rattacher à ta première fenêtre, je te conseille de t'intéresser au Design Pattern Mediator, même si dans ton cas ça en sera une version biaisée par le fait que tu as un nombre d'objets définis à l'avance.
    Cela te permettra tout de même de clarifier ton code en codant tes interactions entre tes objets au sein de ton Mediator.
    Et si tu mets en place un Mediator, tu peux alors gérer le cas où tes objets ne sont pas encore créés, en choisissant ce que tu souhaites faire, les créer au vol, retourner un msg d'erreur, etc ...

    Mediator :
    http://sourcemaking.com/design_patterns/mediator
    http://www.codeproject.com/KB/architecture/csdespat_5.aspx
    http://www.blackwasp.co.uk/Mediator.aspx

    En espérant que cela t'aide.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    mercredi 27 janvier 2010 14:51
  • ok et merci , v regarder ces  liens

    mais ce que je comprends pas c que en visual basic  ou C# windows Form on peut le faire  mais en WPF j y arrive pas
    lorsqu 'on dépose un control dans un windows1 il est bien crée et si on regarde dans explorateur d' objet on retrouve ce control_perso  qui fait parti  de la class windows1 !!
    dailleur si on écrit du code a partir de class windows1 on peut écrire windows1.control_perso, la pas de problème
    mais si on on se place dans le code d' une auttre class windows2 la on ne peut plus acceder a control_perso en codant

    windows1.control_perso  :(
    mercredi 27 janvier 2010 15:21
  • Bonjour Dragonix,

    Je ne fais pas (encore ;) ) de WPF.
    Par contre, en y regardant de plus près, manifestement il te faut créer une propriété du Form pour pouvoi accéder à ton Control :
    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/a0f87e54-9bde-4d8e-a5ec-27c8bb94616b/

    Pour faire un exemple :

        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
     
            public TextBox TextBox1
            {
                get { return this.textBox1; }
            }
        }


    Et cela te permettra d'accéder à ta TextBox de n'importe où.

    Cordialement,

    Thomas
    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    mercredi 27 janvier 2010 16:53
  • je sais pas si correspond a ce que je recherche, sûrrement parce que  je décris pas très bien mon problème pourtant a la base le problème est simple

    dailleur ton exemple moi ne fonctionne pas.
     Si je crée 2 fenêtres wpf en c# , je place un textBox1 sur windows1 je mets ton code de propriété je me place dans le code de windows2 et la surprise .... l' intelligence de visual me signal qu' une référence d' objet est requise .

    windows1 code

    namespace Essai{
        /// <summary>
        /// Logique d'interaction pour Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
            public TextBox TextBox1
            {
                get { return this.textBox1; }
            }
    
        }
    }

    code dans windows2

    namespace Essai{
        /// <summary>
        /// Logique d'interaction pour Window2.xaml
        /// </summary>
        public partial class Window2 : Window
        {
            public Window2()
            {
                InitializeComponent();
            }
    
            TextBox aze = Window1.textBox1 ; ici ce code ne fonctionne pas 
        }
    }


    hum :)

    en plus moi ce sont des user_controls  qui on été créer pour fonctionner et s' interconnecter ensemble mais qui seront utilisés dans des fenêtres différentes 
    le  control principal 
    UserControlNetwormanager   //cette class dispatch et recoit les données des autres class
                                                   //placé dans une Windows1 Fenêtre principale afficher

    et 3 autres controls

    Usercontrolchat  /placé dans une fenêtre windows2 qui ne sera pas forcement afficher
    Usercontrolvideo  /placé dans une fenêtre windows3 qui ne sera pas forcement afficher
    Usercontrolimage /placé dans une fenêtre windows4 qui ne sera pas forcement afficher

    la aussi il y a peu être un problème l' histoire que le control n' est pas crée tant que la fentrêtre ne l' est pas 

    Est ce que cela veut dire que  le le code écrit dans le programmme principal windows1.cs ne peut avoir connaissance des éléments  ou  code d' une autre windows2.xaml ou .cs  avant la compilation un truc comme ca 
    mais lorsqu' on ecrit du code il n' y a pas d' histoire de fen^tre créé ou pas j' ai bien un fichier graphique xaml et un programmme .cs  et a l' intérieur de cette fen^tre j y ai déposé le control donc il a bien été crée lui aussi 
     pour moi c assez obscure car j ai toujours du mal a cerner le system de mécanisme qui doit être appliquer pour respecter les identifiant naviguer entre les espaces de noms  et lié le code avec des objets (graphiques ou non) au fond ,puisque que en fait tout est code
     
     a présent la seule chose qu'il me reste a coder pour qu' il fonctionnent entre eux c de lié par la déclaration  "est de type"  les différents membres objet  de la class  UsercontrolManager avec ceux des  des autres class objet  Usercontrolchat Usercontrolvideo Usercontrolimage

    commme je le disait jadis en visual basic windowsForm rien de plus facile et je pouvais faire référence a un control se situant dans une autre fenêtre depuis le code de la fenêtre principal

    exemple  de code    ComposantCom est un UserControl  MediaControl1 est un UserControl

    ComposantCom.Video = Fmplayer.MediaControl1 


    j ai l' impression que le problème c le fait d' etre dans le programme de la windows1 et non pas dans celui ou se situe le control 


    c ca le vrai problème lorsque des controls sont placé dans la même fenetre il y a aucun problème pour  y faire référence  mais des qu' il sont placé dans des fenêtre différentes la plus possible d' y faire référence enfin aussi facilement qu' en VisualBasic WindowsForm

    j' ymagine que si :)

    voila merci d' avance de toute facon ca me fais toujours avancer toute ces manips

    dailleur jtrouve pas d' exemple de code qui mettent en scene plusieur fenetre avec des controls qui interagissent entre eux  ca ca m' aiderai beaucoup pour certaines trames

    • Modifié Dragonix vendredi 29 janvier 2010 02:21
    mercredi 27 janvier 2010 20:24
  • Bonjour,

    Vous avez pris une mauvaise habitude sous VB avec Windows Forms de ne pas instancier vos fenêtres. Sous WPF, vous devez absolument créer des instances de fenêtres (comme en C# ou plus généralement en programmation orienté objet).

    Le code suivant en VB .NET sous Windows Forms :
    MaForm.Show()
    Se traduit proprement par :

    Dim uneInstance As MaForm
    uneInstance = new MaForm()
    uneInstance.Show()
    Il en est de même avec votre fenêtre Window1, il faut écrire :

    Dim uneInstance As Window1
    uneInstance = new Window1()
    uneInstance.textBox1.Text = "Toto"
    

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    jeudi 28 janvier 2010 21:33
    Modérateur
  • Salut, et merci à tous de prendre de votre temps :)
    j'vois pas trop ou j' ai  codé de cette façon dans ce post, je suis en accord avec ce que vous m' expliquez.m^m si j' ai pu pratiquez ce codage qui peux fonctionner dans des cas simples.

    peu ^^etre est-ce en rapport avec ca:
    TextBox aze = Window1.textBox1 ; ici ce code ne fonctionne pas

    Windons1 apparait bien dans Intellissence ,mais pas textbox1
    et m^me si je crée une instance de windows1 pas mieux !


    mais y a t- il un rapport avec mon problème?
    le fait de créer cette instance (copie de la fenetre ) ,rendra t- il les controls qui ont été déposé dedans accessiblent lors du codage du programme lié a une autre fenêtre, parceque moi c ca que je tente de faire .

    je sais je me répètes, mais même en utilisant une solution vierge WPF en visual C# dans lequel je crée deux Fene^tre windows1.xaml  et windows2.xaml dans windows1 je dépose un control Textbox, si je me place dans le code de windows2 .cs et que la je veux atteinde le control Textbox  je ne peux pas,plutôt  je ne vois pas comment faire.

    je viens aussi d' essayer de créer une instance de cette Windows1 qui contient le control  depuis le code  winows2.cs pas mieux arffff    

    vendredi 29 janvier 2010 02:17
  • Bonjour,

    "mais y a t- il un rapport avec mon problème?
    le fait de créer cette instance (copie de la fenetre ) ,rendra t- il les controls qui ont été déposé dedans accessiblent lors du codage du programme lié a une autre fenêtre, parceque moi c ca que je tente de faire .
    "

    Oui.

    Lorsque vous écrivez (en Windows Forms) :
    MaForm.textBox1.Text = "Blabla";

    C'est le compilateur qui génère derrière automatiquement une instance unique de votre fenêtre.
    C'est à dire que le compilateur génère en réalité (en gros) le code suivant :

    Dim uneInstance As MaForm
    uneInstance = new MaForm()
    uneInstance.Show()
    Est-ce que vous confirmez que vos fenêtres sont dans le même projet ?

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    vendredi 29 janvier 2010 08:33
    Modérateur
  • Bonjour, cool la réponse matinale mici :)

    actuellement je souhaites juste résoudre le problème au plus simple donc avec ma solution vierge qui ne contient que un control TextBox1 dans une fenetre windows1   et  cette solution contient en effet une fenêtre windows1 et windows2

    je comprend pas pourquoi on parle de compilation moi mon problème ne se situe pas à la compilation mais dans ma programmation ,et je cherche pas à afficher quoi que ce soit pour l' instant je suis pas sûr de me faire comprendre

    je veux juste pouvoir :

    dans une solution vierge WPF en visual C# dans lequel je crée deux Fenêrtres windows1.xaml  et windows2.xaml dans windows1 je dépose un control Textbox, si je me place dans le code de windows2 .cs et que je tente de coder

     par exemple  :

    string  MonContenuTextBox = Windows1.Textbox1.text; 




    //la en fait Intellisence ne me propose pas TextBox1

    donc comment accéder à Textbox1?

    et si je crée une instance de cette windows1  ça ne change rien
    Windows InstanceWindows1 = new Windows1();
    string MonContenuTextBox = InstanceWindows1.Textbox1.text;
    la aussi Textbox1 n' est toujours pas proposer par Intellissence

    je le répète ce code n' est juste qu' un exemple simple dont le but recherché est de pouvoir accéder à un control lors de l' écriture de code  depuis le code d' une autres class que celle ou se trouve le ou les controls.

    Ce qui ne pose aucun problème lorsque vous êtes dans le code lié de la Class (fenêtre1) ou a été déposé le control
    la pas de problème on peux écrire

    exemple :    This.Textbox1 etc.....  

    Dailleur en écrivant cette dernière ligne juste au dessus que ca marche pas avec Windows1 au lieu de This , j' ai remarqué que lorsque j' utilise le code Windows1. etc... Intellisence me propose que les propiétés
    alors du coup si je me place dans un code d' une autre class Fenêtre c pas près de marcher avec l' instruction    " windows.UnControlQuelcuonque"

    en fait ce qui m' arrangerais bien la c un exemple de code qui mets en oeuvre le petit exemple simplement a savoir

    une solution C# WPF qui contient :
    Windows1.xaml dedans un control TextBox1 déposé  + Windows1.cs
    Windows2.xaml   un Windows2.cs et dedans  le code qui permette de rendre accesible ce ptit con de control Textbox1 qui n' est pas proposé par Intellissence" qui doit être aveugle :) oups c' est ca d' être un noob "
    hhhhhharrrrrrrrrrr :)"
    • Modifié Dragonix samedi 30 janvier 2010 20:58
    vendredi 29 janvier 2010 09:48
  • Bonjour et merci , bon à force de chercher à comprendre vos remarques merci Gille ,qui je l' avoue étaient en rapport avec mon problème.

    mais aveuglé par le fait d' avoir déja essayé de créer une instance pour résoudre ce problème  mais sans succès pour la raison expliqué après je ne comprenais pas vos remarques, parcourant le forum de long en large pour tomber sur mon fameux problème

    http://social.msdn.microsoft.com/Forums/fr-FR/visualcsharpfr/thread/8bac02c7-5dd3-4ccf-9117-e702bbe6a8e9

    et voila  résolu
    donc du coup j' ai fais la mêmê erreur  en pensant que c' était le type  system.windows qu' on déclarait pour l'instance à créer  au lieu du type de fenêtre de la windows qui héberge le control
    du coup

    Fchat InstanceFchat = new Fchat ();c'est ok          // au lieu de  : Windows.InstanceFchat = new Fchat()
    netWorkManager1.Chat = InstanceFchat.chatcontrol1; // c' est ok chatcontrol1 est proposé par Intellicense


    j' ai tellement essayé de choses, le principal c que je sois débloqué

    donc du coup Question
    si j' ai besoin d' accéder a un control de Fchat ou autre d' afficher cette fenêtre de la fermer et la réouvrir sachant que certaines données doivent persister dans cette fenêtre
    je dois toujours utiliser cett instance  IFchat maintenant

    • Marqué comme réponse Dragonix samedi 30 janvier 2010 13:00
    samedi 30 janvier 2010 12:50