Haga que una parte del texto de una etiqueta se resalte en negrita

¿Hay alguna forma de hacer que una label.text sea ​​negrita?

 label.text = "asd" + string; 

Me gustaría que la porción de string fuera negrita.

Es posible, ¿cómo puede hacerse esto?

WinForms no permite hacerlo.

La siguiente clase ilustra cómo hacerlo anulando OnPaint() en la clase Label de WinForms. Puedes refinarlo. Pero lo que hice fue usar el carácter de la tubería ( | ) en una cadena para decirle al método OnPaint() que imprima el texto antes de | como negrita y luego como texto 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); } } } 

He aquí cómo usarlo:

 LabelX x = new LabelX(); Controls.Add(x); x.Dock = DockStyle.Top; x.Text = "Hello | World"; 

Hola se imprimirá en negrita y mundo en normal.

WebForms

Use el control Literal y agregue una etiqueta alrededor de la parte del texto que desea:

_myLiteral.Text = “Hola grande mundo”;

Winforms

Dos opciones:

  1. Coloque dos tags una al lado de la otra (mucho más fácil)
  2. Label subclase y haga su propio dibujo personalizado en el método OnPaint() .

La segunda opción ya ha sido respondida .

Esta es una explicación sobre la sugerencia de Simon de reemplazar el control Label con un control RichTextBox solo lectura.

  1. Reemplace el control Label con un control RichTextBox, la misma ubicación y tamaño. En las notas siguientes, el nombre del control es rtbResults.

  2. Haga que sea de solo lectura: rtbResults.ReadOnly = True;

  3. Sin bordes: rtbResults.BorderStyle = BorderStyle.None;

  4. En lugar de asignar la cadena que se mostrará a Label.Text , la asigna a RichTextBox.Rtf y aplica un formato RTF simple.

El siguiente código es una muestra: muestra palabras generadas por un progtwig tramposo de Scrabble donde las letras de alto valor están en negrita.

  ///  /// Method to display the results in the RichTextBox, prefixed with "Results: " and with the /// letters J, Q, X and Z in bold type. ///  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 + "}"; } ///  /// Method to apply RTF-style formatting to make all occurrences of a substring in a string /// bold. ///  private static string MakeSubStringBold(string theString, string subString) { return theString.Replace(subString, @"\b " + subString + @"\b0 "); } 

La forma más fácil de hacer lo que desea es simplemente agregar dos tags. De esta forma, podría hacer que una negrita se vea bien con una posición adecuada.

La forma normal sería crear un control que tenga dos o más tags y podría establecer las propiedades en cada una de ellas. También esto tiene la ventaja de que es reutilizable.

¿Necesita ser un control de Label , o solo necesitas poner texto en un lugar en particular? Si es lo primero, tendrá que hacer una pintura personalizada como lo han notado otras personas. De lo contrario, podría usar un RichTextBox solo lectura.

En WinForms anula el método Label.OnPaint () y dibuja el texto usted mismo.

En ASP.NET puedes hacer:

 label.Text = string.Format("asd {0}", string); 

Pero, como todo el mundo dice, depende de lo que estés usando.

Depende de cuán pragmático sea usted. Algo que suena demasiado, pero que podría funcionar, es usar un control de navegador web en su forma y alimentarlo con el marcado HTML. Como dije overkill para una etiqueta, pero si tiene que formatear más de una línea de texto, podría ser una opción. – H. Abraham Chavez acaba de editar

Use el control UltraLabel de Infragistics: admite el formato html. Probablemente haya otras soluciones de terceros también.

Construí un UserControl que contiene un TransparentRichTextBox que te permite formatear porciones de texto usando la syntax RTF.

Nada especial y la syntax es bastante fácil de entender. Compruébalo aquí .

Solución VB.NET

Tomé la respuesta de respuesta de @ affan de extender la clase de Label y anular el método OnPaint .

Traducí su solución a VB e hice algunos cambios para superar algunos problemas que estaba teniendo con el relleno. Mi versión también hace que el texto a la derecha del carácter de la tubería | negrita en lugar de la izquierda.

Ejemplo: Ejemplo

 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