将Label的文本部分设置为粗体样式

时间:2010-01-14 09:45:49

标签: c# .net winforms

有没有办法让label.text的一部分变得大胆?

label.text = "asd" + string;

希望string部分为粗体。

可能,怎么办呢?

12 个答案:

答案 0 :(得分:27)

以下类通过覆盖OnPaint()类WinForms中的Label来说明如何执行此操作。你可以改进它。但我所做的是在字符串中使用竖线字符(|)告诉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";       

您好将以粗体和正常世界打印。

答案 1 :(得分:21)

WinForms不允许这样做。

答案 2 :(得分:18)

的WebForms

使用Literal控件,并在所需文字部分周围添加<b>标记:

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

的Winforms

两个选项:

  1. 并排放置两个标签(更容易)
  2. 子类Label并使用OnPaint()方法执行您自己的自定义绘图。
  3. 第二个选择已经answered

答案 3 :(得分:5)

这是Simon对于使用只读RichTextBox控件替换Label控件的建议的详细说明。

  1. 将Label控件替换为RichTextBox控件,位置和大小相同。在以下注释中,控件的名称是rtbResults。

  2. 将其设为只读:rtbResults.ReadOnly = True;

  3. 无国界:rtbResults.BorderStyle = BorderStyle.None;

  4. 不是将要显示的字符串分配给Label.Text,而是将其分配给RichTextBox.Rtf,并应用一些简单的RTF格式。

  5. 以下代码是一个示例 - 它显示由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 ");
      }
    

答案 4 :(得分:2)

简单的方法就是添加两个标签。通过这种方式,你可以制作一个粗体,并且通过适当的定位看起来会很好。

通常的方法是创建一个包含两个或多个标签的控件,然后可以在每个标签上设置属性。这也具有可重复使用的优点。

答案 5 :(得分:2)

是否需要Label控件,或者您只需要将文本放在特定位置?如果是前者,你需要像其他人注意到的那样做自定义绘画。如果没有,您可以使用只读RichTextBox

答案 6 :(得分:1)

在WinForms中覆盖Label.OnPaint()方法并绘制自己的文本。

答案 7 :(得分:1)

在ASP.NET中你可以这样做:

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

但是和其他人一样,取决于你正在使用的是什么。

答案 8 :(得分:0)

这取决于你是多么务实。听起来有些过分但可能有效的方法是在表单中使用Web浏览器控件,并将其添加到HTML标记中。正如我所说的标签过度杀伤,但如果您需要格式化多行文本,则可能是一种选择。 - H. Abraham Chavez刚刚编辑

答案 9 :(得分:0)

使用Infragistics&#39; UltraLabel 控件 - 它支持HTML格式。可能还有其他第三方解决方案。

答案 10 :(得分:0)

我构建了一个UserControl,其中包含TransparentRichTextBox,允许您使用RTF语法格式化部分文本。

没什么特别的,语法很容易理解。请查看here

答案 11 :(得分:0)

VB.NET解决方案

我做了@affan's answer答案,扩展了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