突出显示RichTextBox中的一行

时间:2014-02-22 10:11:47

标签: c# wpf richtextbox textrange

我正在尝试在RichTextBox中突出显示一行。我的尝试是在文本中获取行的位置,然后创建一个表示text.Substring(offset, word.Length)的TextRange。但不知何故,RichTextBox只突出显示前一行的最后2个字符以及实际行的某些字符或仅显示实际行的部分字符。我目前的方法就是这个:

    public void SelectLine(string text)
    {
        int i = new TextRange(editor.Document.ContentStart, editor.Document.ContentEnd).Text.IndexOf(text);
        TextPointer start = editor.Document.ContentStart.GetPositionAtOffset(i);
        TextPointer end = start.GetPositionAtOffset(text.Length);

        TextRange r = new TextRange(start, end);

        if (r != null)
        {
            r.ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.Red);
            r.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.White);
        }
    }

当我尝试选择第二行时,这就是它的样子:

enter image description here

你有什么想法,为什么会这样?

修改 我目前的方法包括WPF RichTextBox。

2 个答案:

答案 0 :(得分:2)

经过大量搜索,我终于找到了这个解决方案。我在计算到给定的行时迭代文档的块。 我不在乎,是否整个段落或只是突出显示的行,因为我写了一个小代码编辑器,它应该显示错误并在给定的源中突出显示它。这是我的突出代码:

    public void SelectLine(int line)
    {
        int c = 0;
        TextRange r;

        foreach (var item in editor.Document.Blocks)
        {
            if (line == c)
            {
                r = new TextRange(item.ContentStart, item.ContentEnd);
                if (r.Text.Trim().Equals(""))
                {
                    continue;
                }
                r.ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.Red);
                r.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.White);
                return;
            }
            c++;
        }
    }

迭代文档的块并检查给定的块是否为空。如果是这样,那么将查看下一个块。

答案 1 :(得分:0)

在研究了很多之后,我找到了一个解决方案,这就是你所需要的一切!

 TextRange Mytextrange2;
 private void Selectline(int line)
    {
        // STEP1: set CaretPosition to fist position of richtextbox (Vietnamese: đưa Carretposition về vị trí đầu của richtextbox)
        TextPointer resetpos = richTextBox.Document.ContentStart;   
        richTextBox.CaretPosition = resetpos;

        // STEP2: get start Position of your line and get startpos of your line +1 (mean end positon of your need line) (Vietnammes: Lấy vị trí đầu và cuối của line)
        TextPointer startPos = richTextBox.CaretPosition.GetLineStartPosition(line);
        TextPointer endPos = richTextBox.CaretPosition.GetLineStartPosition(line + 1);

        // STEP3: return if Error
        if (startPos == null) return;
        if (endPos == null) return;

        // STEP4: Clear properties of your previous line (i'm highlighting line by line of richtextbox, so i need to clear properties of previous line before apply new properties to next line)
// Xóa các thuộc tính áp dụng cho dòng trước, vì tôi bôi đen từng dòng trong richtextbox nên khi bôi đen dòng này tôi sẽ bỏ bôi đen dòng trước kia đi
        if (line != 0) // in this case, i clear properties when line != 0, ofcoursce you can change it (trong trường hợp dòng 0, tôi không xóa dòng trước vì trước nó không có dòng nào cả)
        {
            Mytextrange2.ClearAllProperties(); 
            //Mytextrange2.ApplyPropertyValue(TextElement.BackgroundProperty,Brushes.DarkGray);
            Mytextrange2.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.DarkGray);
        }

        // STEP5: Select new textrang and apply new properties to your new line // Dùng textrange để chọn dòng cần bôi đen, sau đó add các thuộc tính vào
        Mytextrange2.Select(startPos, endPos); // select range of text to apply new properties
        Mytextrange2.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);  
        Mytextrange2.ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.DarkGray);
        Mytextrange2.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Black);

        // STEP6: scroll richtextbox to next 14th line to make reasonable view (if imposible). // scroll đến 14 dòng sau dòng được chọn, để dòng được chọn ở giữa khung màn hình, bạn có thể chọn dòng khác
        richTextBox.CaretPosition = startPos; // Set CaretPosition to selected line
        startPos = richTextBox.CaretPosition.GetLineStartPosition(14); //(find position of next 14th line to scroll ) Change value 14 to have more reasonable view
        if (startPos != null)  richTextBox.CaretPosition = startPos;   // Set caretposition to position of next 14 lines
        richTextBox.Focus();   // scroll richtextbox to caretposition
    }
  private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // Mytextrange2 là biến toàn cục muốn dùng để thực hiện xóa properties của dòng trước, nên tôi phải khởi tạo ở 1 chỗ khác ngoài hàm Selectline
// Initialize Mytextrang2
        Mytextrange2 = new TextRange(richTextBox.Document.ContentStart,richTextBox.Document.ContentEnd);
    }