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 Presentation Foundation Discussion :

VS2008-C#- Changer de couleur en cours d'ecriture dans une richTextBox


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut VS2008-C#- Changer de couleur en cours d'ecriture dans une richTextBox
    Je suis en train de faire une application en C#. J'ai un richTextBox. J'aimerais pourvoir changer de couleur et d'insérer d'autre ligne.
    Quand j'écris dans le richTextBox, la saisie des textes ont la couleur rouge. Après un clik sur un bouton, les textes changent de couleur en bleu. Et quand je rajoute à nouveau une ligne de texte dans le richTextBox, les textes en bleu restent bleu alors que la nouvelle saisie aura la couleur rouge.
    C'est possible d'avoir deux couleur différente dans la même boite?
    Si oui, on fait comment?(Je veux le faire dynamiquement)
    Merci d'avance

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    C'est encore moi! Je ne sais pas si je n'étais pas claire pour mon problème.
    Aidez-moi svp.
    J'ai réalisé de cette façon :
    J'ai mon richTextBox qui est crée; J'ai défini 2 TextPointeur

    tp1 = rtb.Document.ContentStart;
    tp2 = rtb.Document.ContentEnd;
    Dans l'evenement :
    private void richTextBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
    texte = new TextRange(tp1, tp2);
    rtb.Foreground = Brushes.Red;
    changeRtb = true;
    }

    Dans l'evenement clik_bouton :

    if (changeRtb)
    {
    MessageBox.Show(texte.Text);
    texte.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue);
    tp1 = texte.End;
    changeRtb = false;
    }

    Quand je fais le test, il m'affiche une fois sur 2 le texte, càd, il a bien trouvé le texte au premier test, il ne trouve pas la nouvelle saisie au 2eme test, et il m'affiche la 3eme saisie pour le 3 eme test et ainsi de suite.
    Pour la couleur, une fois je clik le bouton, il les changes en bleu et meme la nouvelle saisie reste en bleu....
    Si je change : texte.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue); par
    rtb.Foreground = Brushes.Blue;
    Il me change tout pour la même couleur....

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Tu peux faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                this.richTextBox1.SelectAll();
                this.richTextBox1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Blue));
                this.richTextBox1.TextChanged += new TextChangedEventHandler(richTextBox1_TextChanged);
            }
            void richTextBox1_TextChanged(object sender, TextChangedEventArgs e)
            {
                this.richTextBox1.Selection.Select(this.richTextBox1.Selection.Start.GetPositionAtOffset(-1), this.richTextBox1.Document.ContentEnd);
                this.richTextBox1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red));
                this.richTextBox1.TextChanged -= new TextChangedEventHandler(richTextBox1_TextChanged);
                this.richTextBox1.Selection.Select(this.richTextBox1.Document.ContentEnd, this.richTextBox1.Document.ContentEnd);
            }
    où button1 est le bouton sur lequel on click pour mettre en bleu.

    Oublie pas de lire les tutoriels et les cours de formation pour apprendre la programmation avec C# : http://dotnet.developpez.com/cours/?page=csharp

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour votre aide.
    Voici mon application : j'ai un richTextBox et 2 boutons (si je clique sur le bouton1, la couleur de la saisie rouge devient bleu; si je clique sur le bouton2 la couleur bleu change en noir).
    Si j'ai le contenu en noir et je fait une nouvelle saisie, la couleur de la nouvelle saisie est bien en bleu. Nikel!!!
    Je dois cliquer le bouton1 avant de cliquer le bouton2.
    L'application fonctionne bien : voici le code

    private void richTextBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
    texte = new TextRange(this.richTextBox1.Selection.Start.GetPositionAtOffset(-1), this.richTextBox1.Document.ContentEnd);
    this.richTextBox1.Selection.Select(this.richTextBox1.Selection.Start.GetPositionAtOffset(-1), this.richTextBox1.Document.ContentEnd);
    this.richTextBox1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red));
    this.richTextBox1.TextChanged -= new TextChangedEventHandler(richTextBox1_TextChanged);
    }

    private void bouton1_Click(object sender, RoutedEventArgs e)
    {
    texte.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Violet);
    this.richTextBox1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue);
    this.richTextBox1.TextChanged -= new TextChangedEventHandler(richTextBox1_TextChanged);
    }

    private void bouton2_Click(object sender, RoutedEventArgs e)
    {
    this.richTextBox1.SelectAll();
    this.richTextBox1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Black);
    this.richTextBox1.TextChanged += new TextChangedEventHandler(richTextBox1_TextChanged);
    this.richTextBox1.Selection.Select(this.richTextBox1.Document.ContentEnd, this.richTextBox1.Document.ContentEnd);
    }

    Une autre difficulté : je ne sais pas comment recuperer la dernière modification dans le richTextBox. Je m'explique : si j'ai déjà des textes en couleur noir et je veux ajouter une nouvelle saisie (s1), elle sera en rouge, après le clik sur le bouton1, les textes en noir restent noir et la nouvelle saisie s1 devient bleu. Si à ce moment je veux faire une nouvelle ajout (sans cliquer le bouton2), j'aimerai que la saisie s1 devient rouge et que la nouvelle saisie s2 soit bleu. C'est la mon probleme, si après le clik du bouton1 je fait un ajour, la couleur de la saisie reste bleu!!!! Je ne sais pas si quelqu'un a une idée;
    Merci d'avance

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    si quelqu'un a une idée pour mon problème, n'hésitez pas à me répondre. Je cherche toujours mais je n'y arrive pas à le faire marcher comme il faut.
    Merci d'avance

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    C'est plutôt confus pour moi. Je n'arrive pas à mettre en rapport ce que tu écris avec le code que tu as envoyé.
    Eclaircis-moi : qu'est-ce que la variable texte ? (elle n'est pas déclarée et elle est utilisée dans bouton1_Click sans être initialisée). Complète ton code pour que je puisse reproduire le comportement que tu observes.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Je m'explique :
    J'ai crée un richTextBox. Quand je fait un ajout de texte dans le richTextBox, les textes ajoutés sont en rouge.
    J'ai 2 boutons qui changent la couleur du contenu du richTextBox :
    - bouton1 change les textes rouge en bleu ;
    - bouton2 change les textes bleu en noir.
    Je dois cliquer sur le bouton1 avant de cliquer sur le bouton2.
    Ca fonctionne comme suit :
    Ajout de texte t1 --> t1 est en rouge.
    Cliquer bouton1 --> t1 devient bleu
    Cliquer bouton2 --> t1 devient noir

    Si je rajoute de nouveau texte t2:
    Ajout de texte t2 --> Dans le richTextBox, j'ai t1 en noir et t2 en rouge
    Cliquer bouton1 --> t1 reste noir et t2 devient bleu
    Cliquer bouton2--> t1 et t2 sont noirs

    Le code marche bien pour ca en suivant cette démarche.

    Maintenant j'aimerai que le code fonctionne comme le suivant :
    Disons qu'on a t1 et t2 déjà en noirs dans la boite. Je rajoute un nouveau texte t3:
    Etape 1: Ajout de t3 --> t1 et t2 en noir et t3 en rouge
    Etape 2: Cliquer bouton1 --> t1 et t2 en noir et t3 en bleu
    Etape 3 : Ajout nouveau texte t4 --> Je veux que t1 et t2 reste noir, t3 redevient rouge et t4 en rouge
    Etape 4 : Cliquer bouton1 --> t1 et t2 en noir, t3 et t4 en bleu
    Etape 5: Cliquer bouton2 --> contenu de la boite en noir.

    Avec le code actuel, quand je passe à l'étape 3, j'ai le resultat suivant : t1 et t2 reste noir, t3 reste bleu et t4 en bleu aussi.

    Dans xaml, j'ai fait des liaisons d'évenements : "richTextBox1_TextChanged"

    J'ai crée la variable texte qui prend la valeur de la nouvelle saisie.
    Si je met :
    this.richTextBox1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Violet);

    à la place du
    texte.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue);
    dans le bouton1, tous les contenus de la boite devient bleu.

    Voici le code entier :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
                 
    public partial class ApplicationControl : UserControl
        {
            private bool changeRtb; //prend la valeur true s'il y a eu de modification ou ajout dans la boite; il prend la valeur false après avoir cliqué le bouton1
            private TextRange texte = null;        
    
            public ApplicationControl()
            {
                InitializeComponent();            
            }
    
     private void richTextBox1_TextChanged(object sender, TextChangedEventArgs e)
            {
                texte = new TextRange(this.richTextBox1.Selection.Start.GetPositionAtOffset(-1), this.richTextBox1.Document.ContentEnd);
                this.richTextBox1.Selection.Select(this.richTextBox1.Selection.Start.GetPositionAtOffset(-1), this.richTextBox1.Document.ContentEnd);
                this.richTextBox1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red));           
                this.richTextBox1.TextChanged -= new TextChangedEventHandler(richTextBox1_TextChanged);
                changeRtb = true;                                   
            }       
        }
    
           private void bouton1_Click(object sender, RoutedEventArgs e)
            {
                if (changeRtb)
                {
                    texte.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue);
                    this.richTextBox1.TextChanged -= new TextChangedEventHandler(richTextBox1_TextChanged);
                    changeRtb = false;               
                }                
            }
    
            private void bouton2_Click(object sender, RoutedEventArgs e)
            {
                if (!changeRtb)
                {
                    this.richTextBox1.SelectAll();             
                    this.richTextBox1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Black);
                    this.richTextBox1.TextChanged += new TextChangedEventHandler(richTextBox1_TextChanged);
                    this.richTextBox1.Selection.Select(this.richTextBox1.Document.ContentEnd, this.richTextBox1.Document.ContentEnd);               
                }
            }       
    }

    Merci d'avance

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Voici un peu de code pour te permettre d'aller plus loin (à mon avis il y a moyen de faire beaucoup plus intelligent) :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    private void richTextBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
       this.richTextBox1.TextChanged -= new TextChangedEventHandler(richTextBox1_TextChanged);
       this.SetDocumentEndBrush(Brushes.Red, -3);
    }
    private void bouton1_Click(object sender, RoutedEventArgs e)
    {
       this.ReplaceBrush(Brushes.Red, Brushes.Blue);
       this.richTextBox1.TextChanged += new TextChangedEventHandler(richTextBox1_TextChanged);
    }
    private void bouton2_Click(object sender, RoutedEventArgs e)
    {
       this.ReplaceBrush(Brushes.Blue, Brushes.Black);
       this.richTextBox1.TextChanged += new TextChangedEventHandler(richTextBox1_TextChanged);
    }
    private void SetDocumentEndBrush(SolidColorBrush brush, Int32 offset)
    {
       TextRange textRange = new TextRange(this.richTextBox1.Document.ContentEnd.GetPositionAtOffset(offset), this.richTextBox1.Document.ContentEnd);
       textRange.ApplyPropertyValue(TextElement.ForegroundProperty, brush);
    }
    private void ReplaceBrush(SolidColorBrush sourceBrush, SolidColorBrush targetBrush)
    {
       TextPointer position = this.richTextBox1.Document.ContentStart;
       TextPointer nextPosition = position.GetNextContextPosition(LogicalDirection.Forward);
       while (position != null && nextPosition != null)
       {
          TextRange textRange = new TextRange(position, nextPosition);
          SolidColorBrush textBrush = (SolidColorBrush) textRange.GetPropertyValue(TextElement.ForegroundProperty);
          if (textBrush.Color == sourceBrush.Color)
          {
             textRange.ApplyPropertyValue(TextElement.ForegroundProperty, targetBrush);
          }
     
          // Moves to next position.
          position = nextPosition;
          nextPosition = position.GetNextContextPosition(LogicalDirection.Forward);
        }
    }

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/01/2014, 13h53
  2. Changer la couleur des TextBox et Combobox dans un USF
    Par olivepao dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 05/01/2009, 21h41
  3. Réponses: 3
    Dernier message: 10/04/2007, 18h09
  4. Réponses: 2
    Dernier message: 21/03/2005, 09h03
  5. Changer la couleur d'un item sélectionné dans TTreeview?
    Par nmathon dans le forum Composants VCL
    Réponses: 1
    Dernier message: 21/10/2004, 15h40

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