Est-il possible de faire en sorte qu'une partie d'un label.text
soit en gras?
label.text = "asd" + string;
Voudrait que la portion string
soit audacieuse.
Est-ce possible, comment cela peut-il être fait?
WinForms ne permet pas de le faire.
La classe suivante montre comment procéder en surchargeant OnPaint()
dans la classe Label
de WinForms. Vous pouvez l'affiner. Mais ce que j’ai fait, c’est d’utiliser le caractère de pipe (|
) dans une chaîne pour indiquer à la méthode OnPaint()
d’imprimer le texte avant le |
en gras et après en 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";
Hello sera imprimé en gras et le monde en normal.
Utilisez le contrôle Literal
et ajoutez une balise <b>
autour de la partie du texte souhaitée:
_myLiteral.Text = "Bonjour <b>
big</b>
monde";
Deux options:
Label
et faites votre propre dessin personnalisé dans la méthode OnPaint()
.Le deuxième choix a été répondu déjà.
Ceci est une élaboration de la suggestion de Simon de remplacer le contrôle Label par un contrôle RichTextBox
en lecture seule.
Remplacez le contrôle Label par un contrôle RichTextBox, au même emplacement et à la même taille. Dans les notes suivantes, le nom du contrôle est rtbResults.
Faites-le en lecture seule: rtbResults.ReadOnly = True;
Pas de bordure: rtbResults.BorderStyle = BorderStyle.None;
Au lieu d'attribuer la chaîne à afficher à Label.Text
, vous l'attribuez à RichTextBox.Rtf
et appliquez une mise en forme simple RTF.
Le code suivant est un exemple - il affiche les mots générés par un programme de triche du Scrabble dont 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 ");
}
Doit-il s'agir d'un contrôle Label
ou devez-vous simplement mettre du texte à un endroit particulier? Si c'est le cas, vous devrez faire de la peinture personnalisée comme d'autres personnes l'ont noté. Sinon, vous pouvez utiliser RichTextBox
en lecture seule.
Le moyen le plus simple de faire ce que vous voulez est d’ajouter deux étiquettes. De cette façon, vous pourriez en faire un audacieux, et le résultat sera parfait.
La méthode normale consiste à créer un contrôle comportant deux étiquettes ou plus et vous pouvez définir les propriétés de chacune d'entre elles. Cela a aussi l'avantage d'être réutilisable.
Dans WinForm, substituez la méthode Label.OnPaint () et dessinez le texte vous-même.
En ASP.NET, vous pouvez 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 votre pragmatisme. Quelque chose qui semble excessif, mais pourrait fonctionner, consiste à utiliser un contrôle de navigateur Web dans votre formulaire et à y insérer un balisage HTML. Comme je le disais trop pour une étiquette, mais si vous avez plusieurs lignes de texte à mettre en forme, cela pourrait être une option. - H. Abraham Chavez vient tout juste de modifier
Utilisez Infragistics ' UltraLabel control - il prend en charge le formatage HTML. Il existe probablement d'autres solutions tierces.
Solution VB.NET
J'ai pris la réponse de @ affan answer sur l'extension de la classe Label
et le remplacement de la méthode OnPaint
.
J'ai traduit sa solution en VB et apporté quelques modifications pour résoudre certains problèmes de remplissage. Ma version rend également le texte à droite du caractère de pipe |
gras au lieu de 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
J'ai construit une UserControl
qui contient une TransparentRichTextBox
vous permettant de formater des portions de texte en utilisant la syntaxe RTF.
Rien de spécial et la syntaxe est assez facile à comprendre. Allez voir ici .