если вы хотите применить больше FontStyle к одному и тому же тексту, вы можете использовать побитовые операторы | и ~ | добавляет новый стиль и, например, удаляет существующий стиль
я есть расширенное текстовое поле, которое может содержать строку, содержащую элементы, выделенные жирным шрифтом, курсивом или даже разными шрифтами и размерами. Если я выберу всю строку, включая все различия, как я могу «выделить жирным шрифтом» эту строку без преобразования всей строки в общий шрифт с помощью только «жирного» атрибута?
Например: я хочу включить "Этоэто какой-то text
"в"Этотэто какой-то text
"
Обратите внимание, что «is some» оставалось курсивом, а «text» оставалось другим шрифтом.
То, что у меня сейчас есть, довольно упрощенно:
private void tsBold_Click(object sender, EventArgs e)
{
if (rtb.SelectionFont == null) return;
Font f;
if (tsBold.Checked)
f = new Font(rtb.SelectionFont, FontStyle.Bold);
else
f = new Font(rtb.SelectionFont, FontStyle.Regular);
rtb.SelectionFont = f;
rtb.Focus();
}
Конечно, это будет применять один и тот же шрифт ко всему выделению. Есть ли способ просто добавить "жирный" к существующему шрифту (ам)?
ОТВЕТ Хотя приведенный ниже «официальный» ответ является лишь верхушкой айсберга, мне нужен был толчок в правильном направлении. Спасибо за совет.
Вот мое официальное исправление:
Я добавил это в мой объект RichTextBox:
/// <summary>
/// Change the richtextbox style for the current selection
/// </summary>
public void ChangeFontStyle(FontStyle style, bool add)
{
//This method should handle cases that occur when multiple fonts/styles are selected
// Parameters:-
// style - eg FontStyle.Bold
// add - IF true then add else remove
// throw error if style isn't: bold, italic, strikeout or underline
if (style != FontStyle.Bold
&& style != FontStyle.Italic
&& style != FontStyle.Strikeout
&& style != FontStyle.Underline)
throw new System.InvalidProgramException("Invalid style parameter to ChangeFontStyle");
int rtb1start = this.SelectionStart;
int len = this.SelectionLength;
int rtbTempStart = 0;
//if len <= 1 and there is a selection font then just handle and return
if (len <= 1 && this.SelectionFont != null)
{
//add or remove style
if (add)
this.SelectionFont = new Font(this.SelectionFont, this.SelectionFont.Style | style);
else
this.SelectionFont = new Font(this.SelectionFont, this.SelectionFont.Style & ~style);
return;
}
using (EnhancedRichTextBox rtbTemp = new EnhancedRichTextBox())
{
// Step through the selected text one char at a time
rtbTemp.Rtf = this.SelectedRtf;
for (int i = 0; i < len; ++i)
{
rtbTemp.Select(rtbTempStart + i, 1);
//add or remove style
if (add)
rtbTemp.SelectionFont = new Font(rtbTemp.SelectionFont, rtbTemp.SelectionFont.Style | style);
else
rtbTemp.SelectionFont = new Font(rtbTemp.SelectionFont, rtbTemp.SelectionFont.Style & ~style);
}
// Replace & reselect
rtbTemp.Select(rtbTempStart, len);
this.SelectedRtf = rtbTemp.SelectedRtf;
this.Select(rtb1start, len);
}
return;
}
Затем я изменил методы щелчка, чтобы использовать следующий шаблон:
private void tsBold_Click(object sender, EventArgs e)
{
enhancedRichTextBox1.ChangeFontStyle(FontStyle.Bold, tsBold.Checked);
enhancedRichTextBox1.Focus();
}