Сделайте часть текста метки жирным шрифтом - PullRequest
30 голосов
/ 14 января 2010

Есть ли способ сделать часть label.text жирной?

label.text = "asd" + string;

Хотелось бы, чтобы часть string была жирной.

Возможно, как это можно сделать?

Ответы [ 12 ]

27 голосов
/ 14 января 2010

Следующий класс иллюстрирует, как это сделать, переопределив OnPaint() в классе Label WinForms. Вы можете уточнить это. Но я использовал символ конвейера (|) в строке, чтобы метод OnPaint() печатал текст до | жирным шрифтом и после него как обычный текст.

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);                
        }
    }
}

Вот как это использовать:

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

Привет будет напечатан жирным шрифтом и мир в нормальном.

21 голосов
/ 14 января 2010

WinForms не позволяют это сделать.

18 голосов
/ 14 января 2010

WebForms

Используйте элемент управления Literal и добавьте тег <b> вокруг нужной части текста:

_myLiteral.Text = "Привет <b> большой </b> мир";

Winforms

Два варианта:

  1. Положите две метки рядом (гораздо проще)
  2. Подкласс Label и создайте свой собственный чертеж в методе OnPaint().

Второй выбор ответил уже.

5 голосов
/ 13 февраля 2013

Это разработка предложения Саймона о замене элемента управления Label только для чтения RichTextBox.

  1. Замените элемент управления Label элементом управления RichTextBox, того же расположения и размера. В следующих примечаниях имя элемента управления - rtbResults.

  2. Сделать это только для чтения: rtbResults.ReadOnly = True;

  3. Без границ: rtbResults.BorderStyle = BorderStyle.None;

  4. Вместо назначения строки для отображения на Label.Text вы назначаете ее на RichTextBox.Rtf и применяете простое форматирование RTF.

Следующий код является примером - он отображает слова, сгенерированные программой мошенничества в Scrabble, где буквы высокого значения выделены жирным шрифтом.

  /// <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 ");
  }
2 голосов
/ 14 января 2010

Должен ли это быть элемент управления Label, или вам просто нужно поместить текст в определенное место? Если первое, вам нужно будет сделать заказную живопись, как отметили другие люди. Если нет, вы можете использовать только для чтения RichTextBox.

2 голосов
/ 14 января 2010

Простой способ сделать то, что вы хотите, это просто добавить две метки. Таким образом, вы можете сделать один жирный шрифт, и при правильном расположении он будет выглядеть хорошо.

Обычным способом было бы создать элемент управления с двумя или более метками, и вы могли бы установить свойства для каждой из них. Также это имеет преимущество, которое можно использовать повторно.

1 голос
/ 14 января 2010

В ASP.NET вы можете сделать:

label.Text = string.Format("asd <span style='font-weight: bold;'>{0}</span>", string);

Но, как все говорят, зависит от того, что вы используете.

1 голос
/ 14 января 2010

В WinForms переопределяйте метод Label.OnPaint () и рисуйте текст самостоятельно.

0 голосов
/ 28 февраля 2016

VB.NET Solution

Я взял @ ответ Аффана ответ о расширении класса Label и переопределении OnPaint метода.

Я перевел его решение на VB и сделал несколько изменений, чтобы преодолеть некоторые проблемы, которые у меня были с заполнением. Моя версия также делает текст справа от символа | жирным шрифтом вместо левого.

Пример: 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 голосов
/ 19 октября 2015

Я создал UserControl, который содержит TransparentRichTextBox, позволяющий форматировать части текста с использованием синтаксиса RTF.

Ничего особенного, и синтаксис довольно прост для понимания. Проверьте это здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...