Rendre la partie du texte d'une étiquette en gras
Est-il possible de faire une partie de label.text
en gras?
label.text = "asd" + string;
Souhaite que la partie string
soit en gras.
Est possible, comment cela peut-il être fait?
12 réponses
La classe suivante illustre comment le faire en remplaçant OnPaint()
dans le Label
classe de WinForms. Vous pouvez l'affiner. Mais ce que j'ai fait était d'utiliser le caractère pipe (|
) dans une chaîne pour dire à la méthode OnPaint()
d'imprimer du texte avant le |
aussi gras et après que le texte normal.
class LabelX : Label
{
protected override void OnPaint(PaintEventArgs e) {
Point drawPoint = new Point(0, 0);
string[] ary = Text.Split(new char[] { '|' });
if (ary.Length == 2) {
Font normalFont = this.Font;
Font boldFont = new Font(normalFont, FontStyle.Bold);
Size boldSize = TextRenderer.MeasureText(ary[0], boldFont);
Size normalSize = TextRenderer.MeasureText(ary[1], normalFont);
Rectangle boldRect = new Rectangle(drawPoint, boldSize);
Rectangle normalRect = new Rectangle(
boldRect.Right, boldRect.Top, normalSize.Width, normalSize.Height);
TextRenderer.DrawText(e.Graphics, ary[0], boldFont, boldRect, ForeColor);
TextRenderer.DrawText(e.Graphics, ary[1], normalFont, normalRect, ForeColor);
}
else {
TextRenderer.DrawText(e.Graphics, Text, Font, drawPoint, ForeColor);
}
}
}
Voici comment l'utiliser:
LabelX x = new LabelX();
Controls.Add(x);
x.Dock = DockStyle.Top;
x.Text = "Hello | World";
Bonjour sera imprimé dans gras et le monde normal.
Formulaires Web
Utilisez le contrôle Literal
et ajoutez une balise <b>
autour de la partie du texte souhaitée:
_myLiteral.Text = "Bonjour <b>
grand </b>
Monde";
Winforms
Deux options:
- mettez deux étiquettes côte à côte (beaucoup plus facile)
- sous-classe
Label
et faites votre propre dessin personnalisé dans la méthodeOnPaint()
.
Le deuxième choix a été répondu déjà.
Ceci est une élaboration sur la suggestion de Simon de remplacer le contrôle D'étiquette par un contrôle en lecture seule RichTextBox
.
Remplacez le contrôle D'étiquette par un contrôle RichTextBox, même emplacement et taille. Dans les notes suivantes, le nom du contrôle est rtbResults.
Faites le en lecture seule:
rtbResults.ReadOnly = True;
Pas de frontières:
rtbResults.BorderStyle = BorderStyle.None;
Au lieu d'affecter la chaîne à afficher à
Label.Text
, vous l'affectez àRichTextBox.Rtf
et appliquez un simple formatage RTF.
Le code suivant est un exemple - il affiche les mots générés par un programme de tricheur de Scrabble où les lettres de grande valeur sont en gras.
/// <summary>
/// Method to display the results in the RichTextBox, prefixed with "Results: " and with the
/// letters J, Q, X and Z in bold type.
/// </summary>
private void DisplayResults(string resultString)
{
resultString = MakeSubStringBold(resultString, "J");
resultString = MakeSubStringBold(resultString, "Q");
resultString = MakeSubStringBold(resultString, "X");
resultString = MakeSubStringBold(resultString, "Z");
rtbResults.Rtf = @"{\rtf1\ansi " + "Results: " + resultString + "}";
}
/// <summary>
/// Method to apply RTF-style formatting to make all occurrences of a substring in a string
/// bold.
/// </summary>
private static string MakeSubStringBold(string theString, string subString)
{
return theString.Replace(subString, @"\b " + subString + @"\b0 ");
}
Le moyen facile de faire ce que vous voulez est juste d'ajouter deux étiquettes. De cette façon, vous pouvez faire un gras, et il aura l'air ok avec un bon positionnement.
La manière normale serait de créer un contrôle qui a deux étiquettes ou plus et vous pouvez définir les propriétés sur chacune d'elles. En outre, cela a l'avantage qui est réutilisable.
Doit - il être un contrôle Label
, ou avez-vous juste besoin de mettre du texte dans un endroit particulier? Si le premier, vous devrez faire de la peinture personnalisée comme d'autres personnes l'ont noté. Sinon, vous pouvez utiliser un readonly RichTextBox
à la place.
Dans WinForms remplacer L'étiquette.OnPaint () méthode et dessiner le texte de votre auto.
Dans ASP.NET vous pourriez faire:
label.Text = string.Format("asd <span style='font-weight: bold;'>{0}</span>", string);
Mais comme tout le monde le dit, Cela dépend de ce que vous utilisez.
Cela dépend de la façon dont vous êtes pragmatique. Quelque chose qui sonne exagéré, mais pourrait fonctionner, est d'utiliser un contrôle de navigateur web dans votre formulaire, et alimentez le balisage HTML. Comme je l'ai dit overkill pour une étiquette, mais si vous avez plus d'une ligne de texte que vous devez formater, il pourrait être une option. – H. Abraham Chavez tout à l'heure Modifier
Utilisez Infragistics ' UltraLabel contrôle - il prend en charge le formatage html. Il existe probablement d'autres solutions tierces.
VB.NET Solution
J'ai pris la réponse de @affan d'étendre la classe Label
et de remplacer la méthode OnPaint
.
J'ai traduit sa solution en VB et fait quelques changements pour surmonter certains problèmes que j'avais avec le rembourrage. Ma version rend également le texte à droite du caractère de tuyau |
gras au lieu de la gauche.
Imports System.Windows.Forms
Imports System.Drawing
' Add some custom functionality to the standard Label Class
Public Class CustomLabel
Inherits Label
' Allow bold font for right half of a label
' indicated by the placement of a pipe char '|' in the string (ex. "Hello | World" will make bold 'World'
Protected Overrides Sub OnPaint(e As PaintEventArgs)
Dim drawPoint As Point = New Point(0, 0)
Dim boldDelimiter As Char = "|"c
Dim ary() As String = Me.Text.Split(boldDelimiter)
If ary.Length = 2 Then
Dim normalFont As Font = Me.Font
Dim boldFont As Font = New Font(normalFont, FontStyle.Bold)
' Set TextFormatFlags to no padding so strings are drawn together.
Dim flags As TextFormatFlags = TextFormatFlags.NoPadding
' Declare a proposed size with dimensions set to the maximum integer value. https://msdn.microsoft.com/en-us/library/8wafk2kt(v=vs.110).aspx
Dim proposedSize As Size = New Size(Integer.MaxValue, Integer.MaxValue)
Dim normalSize As Size = TextRenderer.MeasureText(e.Graphics, ary(0), normalFont, proposedSize, flags)
Dim boldSize As Size = TextRenderer.MeasureText(e.Graphics, ary(1), boldFont, proposedSize, flags)
Dim normalRect As Rectangle = New Rectangle(drawPoint, normalSize)
Dim boldRect As Rectangle = New Rectangle(normalRect.Right, normalRect.Top, boldSize.Width, boldSize.Height)
TextRenderer.DrawText(e.Graphics, ary(0), normalFont, normalRect, Me.ForeColor, flags)
TextRenderer.DrawText(e.Graphics, ary(1), boldFont, boldRect, Me.ForeColor, flags)
Else
' Default to base class method
MyBase.OnPaint(e)
End If
End Sub
End Class