WPF - Text mit Regex in RTB finden und einfärben.

  • WPF

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Toni03.

    WPF - Text mit Regex in RTB finden und einfärben.

    Hey Leute,

    ich habe mal eine Frage: Wie kann ich in WPF den Text einer RichTextBox mit der Regex suchen und einfärben? Ich habe heute angefangen mich mit WPF zu beschäftigen. Allerdings finde ich weder hier in der SuFu noch in Google etwas dazu. In meiner normalen Windows Forms Anwendung habe ich folgenden Code verwendet:

    Spoiler anzeigen

    C#-Quellcode

    1. ​private void ApplySyntaxHighlighting()
    2. {
    3. int marker = this.SelectionStart;
    4. Regex keyWordsYellow = new Regex(@"[0-9]|%");
    5. this.SelectAll();
    6. this.SelectionColor = this.ForeColor;
    7. this.ScrollToCaret();
    8. this.Select(this.Text.Length, 1);
    9. int selPos = this.SelectionStart;
    10. foreach (Match keyWordMatch in keyWordsYellow.Matches(this.Text.ToLower()))
    11. {
    12. this.Select(keyWordMatch.Index, keyWordMatch.Length);
    13. this.SelectionColor = Color.FromArgb(219, 219, 166);
    14. this.SelectionStart = selPos;
    15. this.SelectionColor = this.ForeColor;
    16. }
    17. this.SelectionStart = marker;
    18. }


    Ich habe versucht, den Code noch mal dann in WPF C# zu machen und dadurch dass manche Funktionen anders sind, finde ich mich noch nicht so ganz zurecht. Mein Code in WPF ist:

    Spoiler anzeigen

    C#-Quellcode

    1. ​private void ApplySyntaxHighlighting()
    2. {
    3. int marker = this.SelectionStart;
    4. Regex keyWordsYellow = new Regex(@"[0-9]|%");
    5. this.SelectAll();
    6. this.SelectionBrush = this.Foreground;
    7. this.Select(this.Text.Length, 1);
    8. int selPos = this.SelectionStart;
    9. foreach (Match keyWordMatch in keyWordsYellow.Matches(this.Text))
    10. {
    11. this.Select(keyWordMatch.Index, keyWordMatch.Length);
    12. this.SelectionBrush = new SolidColorBrush(Color.FromRgb(219, 219, 166));
    13. this.SelectionStart = selPos;
    14. this.SelectionBrush = this.Foreground;
    15. }
    16. this.SelectionStart = marker;
    17. }


    Weiß jemand wie ich das jetzt fixen kann?
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Hallo,

    als ich in der WPF einen SnippetEditor programmiert habe, habe ich die AvalonTextbox für das SyntaxHighliting verwendet. Dort kannst du meines Wissens nach auch eigene Regeln definieren.
    Allerdings musst du dafür WPF-konform arbeiten.

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor
    hier mal das ganze mit ner list of strings

    VB.NET-Quellcode

    1. For i = 0 To WortList.Count - 1
    2. Dim keyword As String = UCase(WortList(i))
    3. Dim text As TextRange = New TextRange(RTB.Document.ContentStart, RTB.Document.ContentEnd)
    4. Dim current As TextPointer = text.Start.GetInsertionPosition(LogicalDirection.Forward)
    5. While current IsNot Nothing
    6. Dim textInRun As String = current.GetTextInRun(LogicalDirection.Forward)
    7. textInRun = UCase(textInRun)
    8. If Not String.IsNullOrWhiteSpace(textInRun) Then
    9. Dim index As Integer = textInRun.IndexOf(keyword)
    10. If index <> -1 Then
    11. Dim selectionStart As TextPointer = current.GetPositionAtOffset(index, LogicalDirection.Forward)
    12. Dim selectionEnd As TextPointer = selectionStart.GetPositionAtOffset(keyword.Length, LogicalDirection.Forward)
    13. Dim selection As TextRange = New TextRange(selectionStart, selectionEnd)
    14. ' selection.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold)
    15. selection.ApplyPropertyValue(TextElement.BackgroundProperty, New SolidColorBrush(Colors.Yellow))
    16. RTB.Selection.[Select](selection.Start, selection.[End])
    17. End If
    18. End If
    19. current = current.GetNextContextPosition(LogicalDirection.Forward)
    20. End While
    21. Next
    @ErfinderDesRades Leider findet man nichts was wirklich richtig funktioniert. Ich habe auch versucht es dann noch zu verbessern, hatte aber nicht geklappt.

    @florian03 Ich würde es am liebsten selbst machen

    @r0tzi Kennst du auch eine Methode, mit der man das in Regex machen kann?
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down

    Toni03 schrieb:

    Ich habe heute angefangen mich mit WPF zu beschäftigen.


    Dann lerne doch erst mal richtig WPF bevor du dich mit so einem, doch etwas komplexeren Thema auseinander setzt.

    Toni03 schrieb:

    Ich würde es am liebsten selbst machen


    Dann entweder lernen oder ein Control nehmen, das Leute entwickelt haben die das Gante schon länger machen
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.

    MrTrebron schrieb:

    Dann lerne doch erst mal richtig WPF



    Tue ich ja auch, aber es gibt Sachen die trotzdem nicht verstehe. Also dachte ich, ich könnte hier fragen.
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Ich hatte mir jetzt einen großteil der Grundlagen angeeinet und hab mir schon einige Videos angeschaut und Webseiten zum Thema durchgelesen. Tatsächlich kannte ich das Tutorial von @Nofear23m nicht. Sieht aber sehr vielversprechen aus. Ich werde mich da auf jeden fall mal durcharbeiten.

    Ich habe vorhin auch einen meiner Fehler bei dem obigen WPF Code entdeckt. Ich hatte den Text mit SelectionBrush versucht einzufärben. Ich habe es jetzt mit folgendem Code noch einmal probiert:

    Spoiler anzeigen

    C#-Quellcode

    1. TextPointer CaretPositionStart = this.CaretPosition;
    2. Regex keyWordsYellow = new Regex(@"[0-9]|%");
    3. this.SelectAll();
    4. this.SelectionBrush = this.Foreground;
    5. this.Selection.Select(this.Document.ContentEnd, this.Document.ContentEnd);
    6. TextPointer selPos = this.CaretPosition;
    7. TextRange textRange = new TextRange(this.Document.ContentStart, this.Document.ContentEnd);
    8. foreach (Match keyWordMatch in keyWordsYellow.Matches(textRange.Text.ToLower()))
    9. {
    10. this.Selection.Select(this.Document.ContentStart.GetPositionAtOffset(keyWordMatch.Index), this.Document.ContentStart.GetPositionAtOffset(keyWordMatch.Length));
    11. this.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Color.FromRgb(219, 219, 166)));
    12. this.CaretPosition = selPos;
    13. }
    14. this.CaretPosition = CaretPositionStart;


    Es hat zumindest so weit funktioniert, dass irgendein Teil (nicht der gewünschte) eingefärbt wurde.
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    ich denke du solltest dich mit RegEx Patterns zuerst auseinander setzten
    hier ein kleines Bsp.
    eine Textdatei wird in eine RTB geladen, und ein suche nach Zahlen oder Klammer

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Text.RegularExpressions
    3. Public Class Form3
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. RichTextBox1.LoadFile("E:\Testsearch.txt", RichTextBoxStreamType.PlainText)
    6. End Sub
    7. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    8. Mark(RichTextBox1, "\[(.*?)\]", Color.Blue) 'Text in klammer Blau
    9. Mark(RichTextBox1, "[\.([\])]", Color.Brown) 'die Klammer Brown
    10. Mark(RichTextBox1, "[0-9]", Color.DarkGreen) 'Zahlen DarkGreen
    11. End Sub
    12. Private Sub Mark(ByVal rtb As RichTextBox, ByVal word As String, ByVal color As Color)
    13. Dim matchc As MatchCollection = Regex.Matches(rtb.Text.ToLower(), word.ToLower())
    14. For Each m As Match In matchc
    15. rtb.Select(m.Index, m.Length)
    16. rtb.SelectionColor = color
    17. rtb.Select(rtb.Text.Length, 0)
    18. rtb.SelectionColor = Drawing.Color.Black
    19. Next
    20. End Sub


    hier noch ein Image

    Der Code funktionier leider so nicht in WPF aber trotzdem danke für die Mühe
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down

    Toni03 schrieb:

    Der Code funktionier leider so nicht in WPF


    es sollte auch ein Bsp. für Patterns sein, du hast dir da ein starkes/schwieriges Thema ausgesucht,
    darum mein Vorschlag das in einzelne -Bereiche- auszuteilen

    Patterns
    SyntaxHighliting (bei eingabe?)
    SyntaxHighliting (nach eingabe der zeile)
    SyntaxHighliting (Schlüsslwörter vor definiert?)

    viel Erfolg
    Mit der Regex habe ich ja auch kein Problem. Das Problem liegt ja dabei, dass ich es nicht richtig einfärben kann.
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down