2014-02-22 99 views
3

我試圖突出顯示RichTextBox中的一行。我的嘗試是在文本中獲取該行的位置,然後創建代表text.Substring(offset, word.Length)的TextRange。但不知何故,RichTextBox只會突出顯示前一行的最後2個字符以及實際行的一些字符或實際行的部分字符。我目前的做法是這樣的一個:突出顯示RichTextBox中的一行

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

搜索了很多之後,我終於找到了這個解決方案。我遍歷文檔的塊,同時計數到給定的行。 我不在乎,整個段落還是僅僅是行被突出顯示,因爲我寫了一個小代碼編輯器,它應該顯示錯誤並在給定源代碼中突出顯示它。這是我突出顯示的代碼:

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++; 
     } 
    } 

它遍歷文檔的塊並檢查給定塊是否爲空。如果是這樣,那麼下一個區塊將被調查。

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); 
    }