12
votes

Comment gérer le formatage Richtext (gras / italique / etc.) lors de la modification d'un élément?

J'ai une zone de texte riche pouvant contenir une chaîne comportant des éléments de caractères gras, d'italiques, voire différentes polices et tailles. Si je sélectionne la chaîne entière, y compris toutes les différences, comment puis-je "gras" cette chaîne sans convertir la chaîne entière vers la police générique avec juste un attribut "gras"?

Par exemple: je veux tourner "Ceci est quelque em> texte code> "dans" ceci est quelque em> texte code> p> " p>" P> "

Notez que "Est-ce que certains" sont restés en italique et "texte" restait une police différente. P>

Ce que j'ai actuellement est assez simpliste: p>

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

        enhancedRichTextBox1.Focus();
    }


2 commentaires

Pourquoi est-ce si difficile dans Winforms? C'est un trivial em_setcharformat au niveau Win32. Puisque vous avez la poignée de la fenêtre à portée de main, vous ne pouvez pas le faire de cette façon?


S'il vous plaît ne postez pas de réponse comme mise à jour de votre question. Vous êtes autorisé à répondre à votre propre question. De plus, ainsi, les gens peuvent uplifier votre réponse.


5 Réponses :


6
votes

RTB fait pas supporte ce puits. Vous ne pouvez même pas découvrir la gamme de caractères dans la sélection qui a le même style de police. Commencez par vérifier la propriété Selectionfont en premier, il sera null si la sélection contient un mélange de styles. Si tel est le cas, vous devrez itérer la sélection un caractère à la fois en définissant les propriétés de sélectionStart et de sélectionLength, lisez le SelectionFont jusqu'à ce qu'il change. Appliquez la police modifiée dans la plage que vous avez découverte.

check Cette réponse Pour un moyen de garder cela raisonnablement rapide et sans scintillement.

Notez que la mise en œuvre d'un éditeur avec RTB est un sujet favori sur CodeProject.com. Code d'emprunt, sinon tout le projet, est un bon moyen de réduire la douleur.


2 commentaires

Pour garder le mien "Scicker Free", je viens d'utiliser un objet RTB généré par le code, puis a mis à jour les résultats dans le RTB principal lors de sa fin. Très vite, et pas de scintillement.


Pas une mauvaise idée, très cher cependant. Vous doublez la quantité de mémoire que vous consommez.



0
votes

Si vous souhaitez également modifier sa famille de polices et sa taille de police, vous pouvez utiliser cette méthode: Hans a raison, vous devez parcourir chaque caractère.

  private void ChangeFontStyleForSelectedText(string familyName, float? emSize, FontStyle? fontStyle, bool? enableFontStyle)
    {
        _maskChanges = true;
        try
        {
            int txtStartPosition = txtFunctionality.SelectionStart;
            int selectionLength = txtFunctionality.SelectionLength;
            if (selectionLength > 0)
                using (RichTextBox txtTemp = new RichTextBox())
                {
                    txtTemp.Rtf = txtFunctionality.SelectedRtf;
                    for (int i = 0; i < selectionLength; ++i)
                    {
                        txtTemp.Select(i, 1);
                        txtTemp.SelectionFont = RenderFont(txtTemp.SelectionFont, familyName, emSize, fontStyle, enableFontStyle);
                    }

                    txtTemp.Select(0, selectionLength);
                    txtFunctionality.SelectedRtf = txtTemp.SelectedRtf;
                    txtFunctionality.Select(txtStartPosition, selectionLength);
                }
        }
        finally
        {
            _maskChanges = false;
        }
    }

      /// <summary>
    /// Changes a font from originalFont appending other properties
    /// </summary>
    /// <param name="originalFont">Original font of text</param>
    /// <param name="familyName">Target family name</param>
    /// <param name="emSize">Target text Size</param>
    /// <param name="fontStyle">Target font style</param>
    /// <param name="enableFontStyle">true when enable false when disable</param>
    /// <returns>A new font with all provided properties added/removed to original font</returns>
    private Font RenderFont(Font originalFont, string familyName, float? emSize, FontStyle? fontStyle, bool? enableFontStyle)
    {
        if (fontStyle.HasValue && fontStyle != FontStyle.Regular && fontStyle != FontStyle.Bold && fontStyle != FontStyle.Italic && fontStyle != FontStyle.Underline)
            throw new System.InvalidProgramException("Invalid style parameter to ChangeFontStyleForSelectedText");

        Font newFont;
        FontStyle? newStyle = null;
        if (fontStyle.HasValue)
        {
            if (fontStyle.HasValue && fontStyle == FontStyle.Regular)
                newStyle = fontStyle.Value;
            else if (originalFont != null && enableFontStyle.HasValue && enableFontStyle.Value)
                newStyle = originalFont.Style | fontStyle.Value;
            else
                newStyle = originalFont.Style & ~fontStyle.Value;
        }

        newFont = new Font(!string.IsNullOrEmpty(familyName) ? familyName : originalFont.FontFamily.Name,
                            emSize.HasValue ? emSize.Value : originalFont.Size,
                            newStyle.HasValue ? newStyle.Value : originalFont.Style);
        return newFont;
    }


0 commentaires

0
votes

Je dois le tester encore en termes de références d'objet de police consommant plus de mémoire si

​​Ceci devrait fonctionner P>

        if(rtbCaseContent.SelectedText.Length > 0 ) 
        {
            // calculate font style 
            FontStyle style = FontStyle.Underline;
            Font selectedFont = rtbCaseContent.SelectionFont;

            if (rtbCaseContent.SelectionFont.Bold == true)
            {
                style |= FontStyle.Bold;
            }
            if (rtbCaseContent.SelectionFont.Italic == true)
            {
                style |= FontStyle.Italic;
            }

            rtbCaseContent.SelectionFont = new Font(selectedFont,style);
        }           


0 commentaires

2
votes

Pour faire une sélection de texte audacolaire tout en gardant sa mise en forme intacte, utilisez ceci: xxx pré>

à la sélection de texte libère tout en maintenant sa mise en forme intacte, utilisez ceci: P>

        if (rtb.SelectionFont.Style.ToString().Contains("Bold")) //If the selected character is Bold
            //Make the selected character unBold
            rtb.SelectionFont = new Font(rtb.SelectionFont, rtb.SelectionFont.Style & ~FontStyle.Bold);
        else //If the selected character is unBold
            //Make the selected character Bold
            rtb.SelectionFont = new Font(rtb.SelectionFont, rtb.SelectionFont.Style | FontStyle.Bold);


0 commentaires

0
votes

Si vous souhaitez appliquer plus de FonterStyle sur le même texte, vous pouvez utiliser des opérateurs Bitwise | et ~ | ajoute un nouveau style et ~ supprime un style existant Par exemple xxx


0 commentaires