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 :

string surbrillance richtextbox WPF C#


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Par défaut string surbrillance richtextbox WPF C#
    Bonjour tout le monde,
    En espérant que je sois dans la bonne partie du forum...

    J'ai un texte dans une richtextbox (nommée rtb) et je voudrais mettre en surbrillance un mot que je recherche...
    Dans un texte bête et méchant j'utilise ce qui suit (et qui marche parfaitement):



    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
    //évènement click
    {
    string wordToSearch = "mot";
     
    //Déclaré plus haut
    tr = new TextRange(this.rtb.Document.ContentStart, this.rtb.Document.ContentEnd);
     
    //recherche de la position de départ du mot à mettre en surbrillance
    int startPosition = tr.Text.IndexOf(wordToSearch);
     
    //nombre de ligne pour aller au mot à mettre en surbrillance
    int lines = this.GetLinesCount(tr.Text, startPosition);
     
    //position du mot à mettre en surbrillance au niveau de la richTextBox
    TextPointer startRtb = this.rtb.Document.ContentStart;
    TextPointer start = startRtb.GetPositionAtOffset(startPosition + lines);
    TextPointer end = start.GetPositionAtOffset(wordToSearch.Length);
     
    //maintenant que l'on sait où est le mot, on le selectionne,
    //pour le mettre en surbrillance
    this.rtb.Selection.Select(start, end);
    this.rtb.Selection.ApplyPropertyValue(TextElement.BackgroundProperty,
    this.rtb.SelectionBrush);
    }
     
     
    //fonction qui va compter, le nombre de ligne
    public int GetLinesCount(string str, int startPosition)
    {
    // compte des "\n" et "\r"
    int lines = str.Take(startPosition).Count(k => k.Equals((char)13) || k.Equals((char)10));
     
    //lines + 2 parce que sinon, il manquera la ligne avec le mot recherché
    return lines + 2;
    }

    Mais dès que je change de police (mettre en "Lucida calligraphy" par exemple) ou change la forme du texte (Italic) ou encore la couleur, j'ai un problème de décalage...
    Le mot qui se met en surbrillance est alors systématiquement avant le mot que j'ai choisi (selon le nombre de ligne, le décalage varie entre un ou deux caractères et plusieurs lignes).

    Quand je debug, je voit bien que les positions de départ (startposition + lines) et de fin sont corrects, mais la surbrillance se fait mal!!!

    Ensuite, je ne sais pas comment chercher une erreur quand il n'y en a pas!!!
    Sinon j'ai crut comprendre que le paramètre "offset" est est un comptage d'octets et non de caractères... Mais là encore le décalage est présent quand le formatage du texte change.

    Désolé pour la taille du message, mais je ne voyais pas bien comment faire plus cour et tout aussi détaillé!!!
    En tout cas merci d'avance, et à bientôt...

  2. #2
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Bonjour moi411,

    J'avais cherché une solution pour surligner du texte dans un FlowDocument et j'avais trouvé un truc sur internet. Bon finalement je m'en suis pas servi mais ça marchait pas trop mal mais ce n'est pas du code super évolué

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <RichTextBox x:Name="rtb">
    	<FlowDocument>
    		<Paragraph Foreground="Red" FontStyle="Italic" FontFamily="Lucida Calligraphy">
    			Une chèvre en .Net sur Developpez         
    		</Paragraph>
    	</FlowDocument>
    </RichTextBox>

    Bon j'ai poussé le vice en mettant ta police, une couleur et en italic pour mon test

    Code c# : 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
    private void HighlightText(Regex reg)
    {
    TextPointer start = rtb.Document.ContentStart;
    while (start != null && start.CompareTo(rtb.Document.ContentEnd) < 0)
    {
    	if (start.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
    	{
    		Match match = reg.Match(start.GetTextInRun(LogicalDirection.Forward));
    //récupère la range avec l'index du mot et sa longueur
    		TextRange textrange = new TextRange(start.GetPositionAtOffset(match.Index, LogicalDirection.Forward), start.GetPositionAtOffset(match.Index + match.Length, LogicalDirection.Backward));
    //highlight du texte		textrange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Blue));    
    //on rebascule à fin de la range pour parcourir la suite                
    		start = textrange.End; 
    	}
    	start = start.GetNextContextPosition(LogicalDirection.Forward);
    }
    }

    tu passes en paramètre une regex qui précise ce que tu cherches dans ton texte.

    En espérant que cela puisse t'aider dans ton problème

    @+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Par défaut
    Salut,
    Ca m'a plus qu'aidé!!!
    Ca marche nickel... J'ai adapté pour avoir à peu près la même forme que ce que j'avais, à part ça j'ai laissé les regular expression comme tu as fais...

    En revanche pour quoi mon index comptait mal? Mystère!
    Bref je te remercie.
    Salut.

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

Discussions similaires

  1. wpf colorisation mot clé richtextbox
    Par damii1 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 12/06/2009, 10h44
  2. comment inserer image gif dans richtextbox (c# WPF)
    Par Developpeur87 dans le forum C#
    Réponses: 4
    Dernier message: 13/03/2009, 05h48
  3. Réponses: 2
    Dernier message: 01/07/2008, 21h56
  4. RichTextBox et Binding - WPF
    Par marma dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 16/05/2008, 14h04
  5. string et richtextbox..
    Par poussinphp dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/04/2007, 10h36

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