web-dev-qa-db-fra.com

Mettre une partie du texte d'une étiquette en gras

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?

28
Phil

WinForms ne permet pas de le faire.

19
iburlakov

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.

27
particle

WebForms

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";

Winforms

Deux options:

  1. Placez deux étiquettes côte à côte (beaucoup plus facile)
  2. Sous-classe Label et faites votre propre dessin personnalisé dans la méthode OnPaint().

Le deuxième choix a été répondu déjà.

17
Chris S

Ceci est une élaboration de la suggestion de Simon de remplacer le contrôle Label par un contrôle RichTextBox en lecture seule. 

  1. 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.

  2. Faites-le en lecture seule: rtbResults.ReadOnly = True;

  3. Pas de bordure: rtbResults.BorderStyle = BorderStyle.None;

  4. 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 ");
  }
5
RenniePet

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.

2
Simon

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.

2
Adrian Fâciu

Dans WinForm, substituez la méthode Label.OnPaint () et dessinez le texte vous-même.

1
Tadas Šukys

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.

1
Town

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 

0
H. Abraham Chavez

Utilisez Infragistics ' UltraLabel control - il prend en charge le formatage HTML. Il existe probablement d'autres solutions tierces.

0
vezenkov

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. 

Exemple: Example

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
0
Chris

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 .

0
modiX