Я хочу выбрать конкретный цветной текст в RichTextBox. Например, если я хочу выбрать синий текст, показанный на изображении ниже, как я могу это сделать?Как выбрать определенный цветной текст в элементе управления RichTextBox?
ответ
Это функция, которая возвращает все позиции символов с определенным цветом:
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;
Но, конечно, может быть несколько порций, и вам нужно решить, какой из них выбрать/выделить. Обратите внимание, что только один часть текста может быть выбрана/выделена за раз!
не выделяет текст любого цвета. – user3810361
Конечно, нет. Как я писал: «Вам решать выбрать и выбрать интересующие вас роли». Смотрите мое обновление! – TaW
Вот основной метод:
- Начиная с определенного индекса (возможно, текущее положение курсора), петля над текстом
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);
Возможный дубликат: http://stackoverflow.com/questions/1926264/color-different-parts-of-a-richtextbox-string –
Нет, это наоборот. - Вам придется перебирать текст, чтобы найти позиции (pl!), Где установлен цвет. Вы можете подумать о том, чтобы копаться в коде Rtf, но это сложно .. – TaW