¿Cómo mantengo el formato RichText (negrita / cursiva / etc.) al cambiar cualquier elemento?

Tengo un cuadro de texto enriquecido que puede contener una cadena que tiene elementos en negrita, cursiva o incluso diferentes fuentes y tamaños. Si selecciono la cadena completa, incluidas todas las diferencias, ¿cómo puedo "Negrita" esa cadena sin convertir la cadena completa a la fuente genérica con solo un atributo "negrita"?

Por ejemplo: quiero activar "Thises alg text" dentro "Estaes alg text"

Nota que "is some" permaneció en cursiva y "text" siguió siendo una fuente diferente.

Lo que tengo actualmente es bastante simplista:

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();
}

Por supuesto, esto va a aplicar exactamente la misma fuente a toda la selección. ¿Hay alguna forma de agregar "negrita" a las fuentes existentes?

RESPONDE Si bien la respuesta "oficial" a continuación es solo la punta del iceberg, fue el empujón que necesitaba en la dirección correcta. Gracias por el consejo

Aquí está mi solución oficial:

Agregué esto a mi objeto 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;
    }

Luego cambié los métodos de clic para usar el siguiente patrón:

    private void tsBold_Click(object sender, EventArgs e)
    {
        enhancedRichTextBox1.ChangeFontStyle(FontStyle.Bold, tsBold.Checked);

        enhancedRichTextBox1.Focus();
    }

Respuestas a la pregunta(5)

Su respuesta a la pregunta