2017-02-17 14 views
0

Мне нужно форматировать текст, поскольку он набирается в текстовое поле с богатым текстом. Так, например ..Форматировать текст в richtextbox, который находится между двумя выбранными символами

текст текст (текст текстового текста) текст текст текст.

текст в скобках с изменением на указанный шрифт и цвет при их вводе и при закрытии брекета любой последующий текст вернется к «использованию» шрифтов/цветов шрифтов с расширенными текстовыми полями.

То, что я до сих пор ...

private void FormatMiddleText (string start, string end, Font font, Color color)  
{ 
    this.richTextBox1.SelectionColor = color; 
    this.richTextBox1.SelectionFont = font; 
} 

Использование ...

FontFamily fontFamily = new FontFamily("Arial"); 
Font font = new Font(
    fontFamily, 
    16, 
    FontStyle.Bold, 
    GraphicsUnit.Pixel); 


FormatMiddleText("(",")", Color.Red, font) 

не может работать, как сделать RichTextBox выделение на текст, который находится между началом и концом строка.

+0

Вы забываете выбрать текст перед применением формата. –

ответ

1

Что нужно для отслеживания выбранного текста. Начало и конец. так что это должно идти в ваш метод FormatMiddleText и так как он должен быть индекс int бы предпочтительный тип:

private void FormatMiddleText(int start, int end, Font font, Color color) 
{ 
    richTextBox1.SelectionStart = start; 
    richTextBox1.SelectionLength = end; 

    this.richTextBox1.SelectionColor = color; 
    this.richTextBox1.SelectionFont = font; 
    // reset the selection start so you can keep typing at the right hand side 
    richTextBox1.SelectionStart = richTextBox1.Text.Length; 
} 

Теперь вам нужно следить за типизации. Вам нужно startIndex и подсчитать, как далеко идет текст, который должен быть отформатирован. Кроме того, флаг будет хорошо знать, является ли вы применить «крутой» формат или скучное по умолчанию один

int startIndex = 0; 
int charCount = 0; 
bool startFormatting = false; 

Теперь вы можете использовать TextChanged события для обработки форматирования, как пользователь вводит в тексте:

private void richTextBox1_TextChanged(object sender, EventArgs e) 
{ 
    if (richTextBox1.Text.Last() == '(') 
    { 
     // remember the start index 
     startIndex = richTextBox1.Text.Length-1; // -1 will take the "(" also to be formatted 
     startFormatting = true; // now you can start formatting with the cool font 
    } 

    if (richTextBox1.Text.Last() == ')') 
    { 
     MessageBox.Show("found end "); 
     startIndex = richTextBox1.Text.Length; 
     startFormatting = false; // now you can proceed to format with boring default font    
    } 

    charCount++; 

    if (startFormatting) 
    { 
     FormatMiddleText(startIndex, charCount, font, Color.Red); 
    } 
    else 
    { 
     FormatMiddleText(startIndex, charCount, DefaultFont, Color.Black); 
    } 
} 

Я не нашел способ просто сбросить шрифт и сохранить запись по умолчанию без постоянного форматирования. Поскольку установка richTextBox1.Font = DefaultFont; приведет к сбросу формата между круглыми скобками. Поэтому я решил сохранить форматирование. Если вы найдете способ, пожалуйста, дайте мне знать

0

Это должно сделать трюк.

private void rtb_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.D0 && e.Shift) 
     { 
      this.richTextBox1.SelectionColor = Color.Black; 
     } 
    } 

    private void rtb_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (e.KeyChar == '(') 
     { 
      this.richTextBox1.SelectionColor = Color.Red; 
     } 
    } 

Вы можете использовать SelectionFont вместо SelectionColor, чтобы обеспечить более сложные свойства шрифта. Кроме того, вы можете заменить круглые скобки любыми открывающимися и закрывающимися символами, чтобы получить тот же эффект. Надеюсь это поможет!

+0

Я не могу заставить это работать то, что txtresponse? – user3755946

+0

Извинения. Предполагалось, что txtResponse будет именем вашего RichTextBox. Я отредактировал ответ соответственно. –