将标签的部分文本设置为粗体

38

有没有办法使label.text中的一部分文字加粗?

label.text = "asd" + string;

希望将 string 部分加粗。

这可行吗?如果可以,如何实现?


7
你使用的是WPF还是WinForms?答案会有很大的不同。 - Mehrdad Afshari
1
请检查我的解决方案:https://dev59.com/MnVD5IYBdhLWcg3wWKLc#28728824 对我来说非常有效。 - Nigrimmist
12个回答

32
下面的类展示了如何通过重写 WinForms 的 Label 类中的 OnPaint() 方法来实现。你可以对它进行优化。但我所做的是在一个字符串中使用竖线 (|) 来告诉 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";       

你好将以粗体形式打印并且world以正常字体显示。


如果标签的高度超过一行并且您想在中间垂直居中它(例如 Middle Left),则此代码会破坏垂直对齐。 - Tanuki

21

WinForms不允许你这样做。


6
虽然不是特别容易,但还是有可能的。 - serhio
12
这是什么样的回答? - Xam
1
是的,它可以。这是错误的。您可以重写OnPaint方法。 - Gaspa79
2
不是一个好的答案 - C Sharpen Adpet

21

WebForms

使用Literal控件,将想要的文本部分添加<b>标签:

_myLiteral.Text = "Hello <b>big</b> world";

Winforms

有两种选择:

  1. 将两个标签并排放置(更容易)
  2. 子类化Label并在OnPaint()方法中自定义绘制。

第二种选择已经被回答了。


8
这是对Simon建议的详细阐述,建议用只读RichTextBox控件替换Label控件。
  1. 将Label控件替换为RichTextBox控件,位置和大小相同。在下面的注释中,该控件的名称为rtbResults。

  2. 使其只读:rtbResults.ReadOnly = True;

  3. 无边框:rtbResults.BorderStyle = BorderStyle.None;

  4. 将要显示的字符串赋值给RichTextBox.Rtf而不是Label.Text,并应用一些简单的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 ");
  }

3

您需要的是一个标签控件,还是只需要将文本放在特定位置?如果是前者,您需要进行自定义绘制,正如其他人所指出的那样。如果不是,您可以使用只读的RichTextBox。


2

想要实现您想要的效果,最简单的方法就是添加两个标签。这样,您可以将其中一个加粗,并通过适当的定位使其看起来不错。

正常的方法是创建一个控件,其中包含两个或更多标签,您可以在每个标签上设置属性。此外,这种方法具有可重用性的优点。


1
在ASP.NET中,您可以这样做:
label.Text = string.Format("asd <span style='font-weight: bold;'>{0}</span>", string);

但就像其他人所说的,这取决于你使用的是什么。


1
在WinForms中,重写Label.OnPaint()方法并自己绘制文本。

然而,如果您设置label.text = "asd" + string;,我不知道您将如何区分粗体和普通文本。 - serhio

0
我建立了一个包含 TransparentRichTextBoxUserControl,允许您使用 RTF 语法格式化文本的部分。
这并没有什么特别之处,语法也很容易理解。在这里查看一下吧。

0

这取决于你有多实用。一个听起来有些过度的但是可能可行的方法是在你的表格中使用web浏览器控件,并向其提供HTML标记。正如我所说,对于标签来说有些过度,但如果你需要格式化超过一行文本,那么这可能是一个选项。- H.亚伯拉罕·查韦斯


1
拿一支火箭筒来打一只蚂蚁?但是,这确实是一个选项。 - Joel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接