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();
}
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
Vous devez vous connecter pour publier un commentaire.
RTB ne pas soutenir ce bien. Vous ne pouvez même découvrir la gamme de caractères à l'intérieur de la sélection qui a le même style de police. Commencez par vérifier la SelectionFont bien tout d'abord, il sera nulle si la sélection contient un mélange de styles. Si c'est le cas, vous devrez effectuer une itération de la sélection d'un caractère à la fois par la définition de la SelectionStart et propriétés SelectionLength, lire la SelectionFont jusqu'à ce qu'elle change. Appliquer le changement de police de caractères à l'intervalle que vous avez découvert.
Vérifier cette réponse pour un moyen de garder raisonnablement rapide et sans scintillement.
Note que la mise en œuvre d'un éditeur de texte avec la RTB est un sujet de prédilection à codeproject.com. L'emprunt de code, si pas la totalité du projet, est un bon moyen pour diminuer la douleur.
Pas une mauvaise idée, très cher. Vous êtes doublement de la quantité de mémoire que vous consommez.
OriginalL'auteur Hans Passant
De faire une sélection de texte en gras, tout en conservant la mise en forme intacte, utilisez ceci:
À unBold la sélection de texte, tout en conservant la mise en forme intacte, utilisez ceci:
Noter que le code ci-dessus ne fonctionnera que, si tout le texte sélectionné est même mise en forme (taille de police, style, etc). Ce qui est détecté par la vérification de la SelectionFont bien tout d'abord, il sera nulle si la sélection contient un mélange de styles.
Maintenant de le faire avec tout le texte dans la richtextbox,
Maintenant en Gras/unBold l'ensemble du texte de la richtextbox tout en gardant la mise en forme intacte, vous avez besoin d'une boucle sur tous les personnages de la richtextbox et mettre en Gras/unBold un par un. Voici le code complet:
Si vous avez besoin de faire basculer l'état actuel de Gras (c'est à dire le non-gras texte en Gras et en faire un texte en gras unBold), utilisez ceci à la place:
OriginalL'auteur ePandit
Dans le cas où vous souhaitez également changer la police de la famille et de la taille de la police vous pouvez utiliser cette méthode:
Hans est vrai, vous avez à parcourir chaque personnage.
Pour plus d'explications, vous pourriez aller à: http://how-to-code-net.blogspot.ro/2014/01/how-to-make-custom-richtextbox-control.html
OriginalL'auteur Alexa Adrian
Je suis encore à l'essai dans les conditions de la Police, les références de l'objet de consommer plus de mémoire cependant
Cela devrait fonctionner
OriginalL'auteur Addy
si vous souhaitez appliquer plus de Style sur le même texte, vous pouvez utiliser les opérateurs au niveau du bit | et ~
| ajoute un nouveau style et ~ supprime un style existant
par exemple
OriginalL'auteur Iancu Vlad