Можно ли сделать часть label.text
полужирным?
label.text = "asd" + string;
Желательно, чтобы фрагмент string
был полужирным.
Возможно, как это можно сделать?
Можно ли сделать часть label.text
полужирным?
label.text = "asd" + string;
Желательно, чтобы фрагмент string
был полужирным.
Возможно, как это можно сделать?
WinForms не позволяют это делать.
Следующий класс иллюстрирует, как это сделать, переопределяя 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";
Привет будет напечатан в жирный и мир в обычном режиме.
Используйте элемент управления Literal
и добавьте тег <b>
вокруг части текста, который вы хотите:
_myLiteral.Text = "Hello <b>
большой </b>
мир";
Два варианта:
Label
и сделайте свой собственный чертеж в методе OnPaint()
.Второй вариант был ответил уже.
Это разработка по предложению Саймона о замене элемента управления Label контролом readtonly RichTextBox
.
Замените элемент управления Label с помощью элемента управления RichTextBox, такого же местоположения и размера. В следующих примечаниях имя элемента управления - rtbResults.
Сделайте это только для чтения: rtbResults.ReadOnly = True;
Без границ: rtbResults.BorderStyle = BorderStyle.None;
Вместо назначения строки, отображаемой на 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 ");
}
Легкий способ сделать то, что вы хотите, это просто добавить две метки. Таким образом, вы можете сделать один жирный шрифт, и он будет выглядеть нормально с правильным позиционированием.
Обычный способ - создать элемент управления с двумя или более метками, и вы можете установить свойства для каждого из них. Кроме того, это имеет то преимущество, которое можно использовать повторно.
Нужно ли быть элементом управления Label
, или вам просто нужно разместить текст в определенном месте? Если первое, вам нужно будет сделать обычную роспись, как отметили другие люди. Если нет, вы можете использовать readonly RichTextBox
.
В WinForms переопределите метод Label.OnPaint() и нарисуйте текст самостоятельно.
В ASP.NET вы можете сделать:
label.Text = string.Format("asd <span style='font-weight: bold;'>{0}</span>", string);
Но, как все говорят, зависит от того, что вы используете.
Это зависит от того, насколько вы прагматичны. Что-то, что звучит излишне, но может работать, - это использовать элемент управления веб-браузером в вашей форме и вставлять в него разметку HTML. Как я сказал, слишком много слов для метки, но если у вас есть несколько строк текста, которые нужно форматировать, это может быть вариант. - Х. Абрахам Чавес только что редактировал
Использовать управление Infragistics UltraLabel - он поддерживает форматирование html. Возможно, есть и другие сторонние решения.
Я построил UserControl
, который содержит TransparentRichTextBox
, позволяющий форматировать фрагменты текста с использованием синтаксиса RTF.
Ничего особенного и синтаксиса довольно легко понять. Проверьте здесь.
Решение VB.NET
Я принял @affan answer ответ на расширение класса Label
и переопределение метода OnPaint
.
Я перевел свое решение в VB и сделал несколько изменений, чтобы преодолеть некоторые проблемы, которые у меня были с заполнением. Моя версия также делает текст справа от символа трубы |
полужирным, а не слева.
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