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?

27
demandé sur p.campbell 2010-01-14 12:45:49

12 réponses

WinForms ne permet pas de le faire.

19
répondu iburlakov 2010-01-14 09:48:45

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.

25
répondu particle 2017-04-13 01:35:28

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:

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

16
répondu Chris S 2017-05-23 10:30:58

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

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

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

  3. Pas de frontières: rtbResults.BorderStyle = BorderStyle.None;

  4. 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 ");
  }
4
répondu RenniePet 2016-07-07 11:18:44

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.

2
répondu Adrian Fâciu 2010-01-14 09:55:30

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.

2
répondu Simon 2010-01-14 10:16:37

Dans WinForms remplacer L'étiquette.OnPaint () méthode et dessiner le texte de votre auto.

1
répondu Tadas Šukys 2010-01-14 09:51:24

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.

1
répondu Town 2010-01-14 09:52:21

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

0
répondu H. Abraham Chavez 2013-10-25 15:52:01

Utilisez Infragistics ' UltraLabel contrôle - il prend en charge le formatage html. Il existe probablement d'autres solutions tierces.

0
répondu vezenkov 2014-03-21 12:31:12

J'ai construit un {[0] } qui contient un 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. Découvrez-le ici .

0
répondu modiX 2017-05-23 11:55:16

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.

Exemple: Exemple

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
répondu Chris 2017-05-23 12:02:53