Comment dois-je entretenir RichText mise en forme (gras/italique/etc) lors de la modification d'un élément?

J'ai une zone de texte enrichi qui peut contenir une chaîne qui comporte des éléments de gras, en italique, ou encore les différentes polices et tailles. Si je sélectionne l'ensemble de la chaîne, y compris toutes les différences, comment puis-je "Bold" de cette chaîne sans conversion de la totalité de la chaîne de la police générique avec juste un "bold" attribut?

Par exemple: je veux transformer "Ce est certains text" en "Ce est certains text"

Note que "certains" est resté en italique et "texte" est resté une police différente.

Ce que j'ai actuellement est assez simpliste:

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

Bien sûr, c'est d'aller d'appliquer exactement la même police de caractères pour l'ensemble de la sélection. Est-il possible de simplement ajouter "bold" de la police existant(s)?

RÉPONSE
Alors que le "officielle" de la réponse ci-dessous est juste la pointe de l'iceberg, c'était la j'avais besoin de pousser dans la bonne direction. Merci pour l'astuce.

Voici mon fixe officielle:

J'ai ajouté à mon RichTextBox objet:

    ///<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;
}

J'ai ensuite changé le cliquez sur les méthodes à utiliser le modèle suivant:

    private void tsBold_Click(object sender, EventArgs e)
{
enhancedRichTextBox1.ChangeFontStyle(FontStyle.Bold, tsBold.Checked);
enhancedRichTextBox1.Focus();
}
Pourquoi est-ce si dur en WinForms? C'est une mince EM_SETCHARFORMAT au Win32 niveau. Puisque vous avez la poignée de la fenêtre à la main, ne peut pas vous faire de cette façon?
Merci de ne pas poster une réponse comme une mise à jour de votre question. Vous êtes autorisé à l'auto-répondre à votre propre question. Aussi, de cette façon, les gens peuvent upvote votre réponse.

OriginalL'auteur Jerry | 2011-03-16