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

C# Discussion :

[WPF]Accéder aux contrôles de la class principal [Débutant]


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 37
    Points : 31
    Points
    31
    Par défaut [WPF]Accéder aux contrôles de la class principal
    Bonjour, je débute avec le wpf en C# et j'aurais besoin d'un petit peu d'aide ^^.
    Je souhaiterais modifier un ou plusieurs contrôles de ma class principale (MainWindow), a partir d'une autre class mais je n'y arrive pas.
    J'ai essayé d'instancier la class principale, mais sans succès, j'ai aussi essayé de mettre la propriété x:FieldModifier des mes controls en public, mais rien n’y fait .

    Je vous remercie d'avance.
    Cordialement Quentin.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par quentin869 Voir le message
    Je souhaiterais modifier un ou plusieurs contrôles de ma class principale (MainWindow), a partir d'une autre class mais je n'y arrive pas.
    A mon avis tu pars sur une fausse piste... si tu commences à faire ce genre de choses, ton application va vite devenir un plat de spaghetti incompréhensible. Il y a une bonne raison pour laquelle les contrôles ne sont pas publics par défaut : l'encapsulation. Si tu commences à modifier les membres d'une classe à partir d'une autre, tu casses l'encapsulation, qui est un principe très important de la programmation orientée objet.

    Quel est ton besoin exactement ? Est-ce que tu utilises le pattern MVVM ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 37
    Points : 31
    Points
    31
    Par défaut
    Ah :/, enfaîte pour ne pas polluer ma class principale je comptais faire une autre class que j'ai intitulé download me permettant de faire tout ce dont j'ai besoin pour télécharger des fichiers successivement et donc a chaque téléchargement, notifié l'avancement dans une richtextbox (exemple: préparation, téléchargement en cours(%), téléchargement terminer ...).

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 37
    Points : 31
    Points
    31
    Par défaut
    Je m'excuse d'avance pour le double message.

    J'ai réussi a faire ce que je voulais comme ceci :

    MainWindow:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
            public MainWindow()
            {
                Logger.Info("Start application");
     
                InitializeComponent();
                boxlog = this.richTextBox1;
     
                download.GeneralLogs("Chargement de la version");
                Logger.Info("Chargement de la version");            
            }
     
            public static RichTextBox richTextBoxLogs
            {
                get;
                set;
            }
    Download:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            public void GeneralLogs(string message)
            {
                TextRange range = new     TextRange(MainWindow.richTextBoxLogs.Document.ContentEnd, MainWindow.richTextBoxLogs.Document.ContentEnd);
                range.Text = "\r" + message;
                range.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Black);
            }
    Le problème et donc résolu !

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par quentin869 Voir le message
    Le problème et donc résolu !
    De la façon la plus crade qui soit

    1. ça ne respecte toujours pas l'encapsulation, puisque la RichTextBox est directement accessible depuis l'extérieur
    2. la propriété est statique, ce qui est peut-être pratique dans ton cas, mais qui conceptuellement n'a pas de sens : la RichTextBox appartient à une instance spécifique de MainWindow, pas à la classe MainWindow en général. En plus, qu'est-ce qui se passerait si tu avais plusieurs instances de MainWindow ? (certes, en l'occurrence c'est peu plausible, mais dans le cas général ça ne fonctionnerait pas)

    La classe Download n'a pas besoin de (et ne devrait pas) connaitre en détail la façon dont un message est affiché. Il suffit qu'elle connaisse un objet qui sait comment afficher le message, de façon à bien séparer les responsabilités des classes.

    Une solution propre serait de créer une interface ILogger (par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    interface ILogger
    {
        void LogMessage(string message);
    }
    Faire implémenter cette interface par la classe MainWindow :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MainWindow : Window, ILogger
    {
        ...
     
        public void LogMessage(string message)
        {
            TextRange range = new     TextRange(richTextBox1.Document.ContentEnd, richTextBox1.Document.ContentEnd);
            range.Text = "\r" + message;
            range.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Black);
        }
    }
    Et passer l'instance de MainWindow à la classe de Download, via un paramètre de type ILogger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     // (dans le code de MainWindow)
    download = new Download(this);
    De cette façon, la classe Download n'est pas dépendante de la MainWindow, ni d'une façon particulière d'afficher les logs. Si un jour tu dois afficher les logs autrement, il suffira de faire une autre implémentation de ILogger et de la passer à la classe Download.

    Je t'encourage vivement à lire cet article, et d'autres sur la conception objet en général. L'approche que tu as utilisée semble sans doute plus facile à mettre en oeuvre, mais si ton application grossit et que tu continues à faire ce genre de choses, ça va rapidement devenir impossible à maintenir...

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/04/2007, 16h31
  2. Réponses: 7
    Dernier message: 26/02/2007, 12h07
  3. Accéder aux variable de la classe MyAppView
    Par greghass dans le forum MFC
    Réponses: 3
    Dernier message: 21/11/2006, 15h38
  4. Réponses: 2
    Dernier message: 10/05/2005, 14h20
  5. Réponses: 4
    Dernier message: 28/03/2005, 12h37

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