2016-05-21 5 views
0

Я хочу выбрать конкретный цветной текст в RichTextBox. Например, если я хочу выбрать синий текст, показанный на изображении ниже, как я могу это сделать?Как выбрать определенный цветной текст в элементе управления RichTextBox?

Example of rich text content

+0

Возможный дубликат: http://stackoverflow.com/questions/1926264/color-different-parts-of-a-richtextbox-string –

+0

Нет, это наоборот. - Вам придется перебирать текст, чтобы найти позиции (pl!), Где установлен цвет. Вы можете подумать о том, чтобы копаться в коде Rtf, но это сложно .. – TaW

ответ

1

Это функция, которая возвращает все позиции символов с определенным цветом:

List<int> getColorPositions(RichTextBox rtb, Color col) 
{ 
    List<int> pos = new List<int>(); 
    for (int i = 0; i < rtb.Text.Length; i++) 
    { 
     rtb.SelectionStart = i; 
     richTextBox1.SelectionLength = 1; 
     if (rtb.SelectionColor.ToArgb() == col.ToArgb()) pos.Add(i); 
    } 
    return pos; 
} 

Это до вас, чтобы выбрать и выбрать те части, которые заинтересованы в ..

Если вы уверены, что только один номер имеет цвет, который вы ищете, вы можете выбрать эту порцию следующим образом:

rtb.SelectionStart = pos[0]; 
rtb.SelectionLength = pos.Count; 

Но, конечно, может быть несколько порций, и вам нужно решить, какой из них выбрать/выделить. Обратите внимание, что только один часть текста может быть выбрана/выделена за раз!

+0

не выделяет текст любого цвета. – user3810361

+0

Конечно, нет. Как я писал: «Вам решать выбрать и выбрать интересующие вас роли». Смотрите мое обновление! – TaW

1

Вот основной метод:

  • Начиная с определенного индекса (возможно, текущее положение курсора), петля над текстом RichTextBox и выбора каждого символа, один за одним.
  • Свойство SelectionColor можно найти, чтобы определить, подходит ли выбранный вами символ.
  • Как только вы нашли персонажа нужного цвета, помните его индекс.
  • Продолжить цикл до тех пор, пока вы не найдете персонажа не цвет, который вас интересует (или вы достигли конца текста); помните этот индекс.
  • Теперь вы можете выбрать текст между двумя индексами: Select(firstIndex, secondIndex - firstIndex).

Вы можете создать метод расширения для RichTextBox который инкапсулирует выше в хороший метод простой в использовании:

public static class RichTextExtensions 
{ 
    /// <summary> 
    /// Searches for text in a RichTextBox control by color and selects it if found. 
    /// </summary> 
    /// <param name="rtb">The target RichTextBox.</param> 
    /// <param name="color">The color of text to search for.</param> 
    /// <param name="startIndex">The starting index to begin searching from (optional). 
    /// If this parameter is null, the search will begin at the point immediately 
    /// following the current selection or cursor position.</param> 
    /// <returns>If text of the specified color was found, the method returns the index 
    /// of the character following the selection; otherwise, -1 is returned.</returns> 
    public static int SelectTextByColor(this RichTextBox rtb, Color color, int? startIndex = null) 
    { 
     if (rtb == null || rtb.Text.Length == 0) return -1; 
     if (startIndex == null) 
     { 
      if (rtb.SelectionLength > 0) 
       startIndex = rtb.SelectionStart + rtb.SelectionLength; 
      else if (rtb.SelectionStart == rtb.Text.Length) 
       startIndex = 0; 
      else 
       startIndex = rtb.SelectionStart; 
     } 
     int matchStartIndex = rtb.FindTextByColor(color, startIndex.Value, true); 
     if (matchStartIndex == rtb.Text.Length) 
     { 
      rtb.Select(matchStartIndex, 0); 
      return -1; 
     } 
     int matchEndIndex = rtb.FindTextByColor(color, matchStartIndex, false); 
     rtb.Select(matchStartIndex, matchEndIndex - matchStartIndex); 
     return matchEndIndex; 
    } 

    private static int FindTextByColor(this RichTextBox rtb, Color color, int startIndex, bool match) 
    { 
     if (startIndex < 0) startIndex = 0; 
     for (int i = startIndex; i < rtb.Text.Length; i++) 
     { 
      rtb.Select(i, 1); 
      if ((match && rtb.SelectionColor == color) || 
       (!match && rtb.SelectionColor != color)) 
       return i; 
     } 
     return rtb.Text.Length; 
    } 
} 

Вы можете вызвать метод расширения, как показано ниже. Обратите внимание, что если ваш RichTextBox элемент управления имеет HideSelection (он будет по умолчанию), вам нужно будет установить фокус обратно на RichTextBox, чтобы просмотреть выделенный текст.

richTextBox1.SelectTextByColor(Color.Blue); 
richTextBox1.Focus(); 

Если вы хотите, чтобы поиск начинается с определенного индекса (например, начало текста), а не текущее положение курсора, вы можете передать этот индекс к методу в качестве второго параметра:

richTextBox1.SelectTextByColor(Color.Blue, 0); 

 Смежные вопросы

  • Нет связанных вопросов^_^