Как сохранить форматирование RichText (полужирный / курсив и т. Д.) При изменении любого элемента?

У меня есть расширенное текстовое поле, которое может содержать строку с элементами полужирного, курсивного или даже другого шрифта и размера . Если я выберу всю строку, включая все различия, как я могу выделить эту строку полужирным шрифтом без преобразования всей строки в общий шрифт с помощью только атрибута «полужирный»?

Например: я хочу изменить значение «Это какой-то текст » в " Это некий текст "

Обратите внимание, что "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();
}

Конечно, будет применен один и тот же шрифт ко всему выделению. Есть ли способ просто добавить полужирный шрифт к существующим шрифтам?

ОТВЕТ в " Это некий текст "

Обратите внимание, что "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();
}

Конечно, будет применен один и тот же шрифт ко всему выделению. Есть ли способ просто добавить полужирный шрифт к существующим шрифтам?

ОТВЕТ в " Это некий текст "

Обратите внимание, что "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();
    }
11
задан Jerry 16 March 2011 в 15:31
поделиться