【问题标题】:Make portion of a Label's Text to be styled bold将标签文本的一部分设置为粗体
【发布时间】:2010-01-14 09:45:49
【问题描述】:

有没有办法让label.text 的一部分变粗?

label.text = "asd" + string;

希望string 部分加粗。

有可能吗,怎么办?

【问题讨论】:

标签: c# .net winforms


【解决方案1】:

下面的类说明了如何通过覆盖 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";       

Hello 将以 粗体 打印,而 world 则以正常形式打印。

【讨论】:

    【解决方案2】:

    网络表单

    使用Literal控件,并在你想要的文本部分周围添加<b>标签:

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

    Winforms

    两种选择:

    1. 并排放置两个标签(容易得多)
    2. 继承 Label 并在 OnPaint() 方法中进行自定义绘图。

    第二个选项已经是answered了。

    【讨论】:

      【解决方案3】:

      WinForms 不允许您这样做。

      【讨论】:

      • 这不是特别容易,但可能。
      • 这是什么答案??
      • 是的。这是错误的。您可以覆盖 OnPaint 方法。
      【解决方案4】:

      这是对 Simon 将 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 ");
        }
      

      【讨论】:

        【解决方案5】:

        它是否需要是Label 控件,或者您只需要将文本放在特定位置?如果是前者,您将需要像其他人所指出的那样进行自定义绘画。如果没有,您可以改用只读的RichTextBox

        【讨论】:

          【解决方案6】:

          简单的方法就是添加两个标签。这样一来,你就可以加粗一个,而且如果定位合适,它看起来还不错。

          通常的方法是创建一个具有两个或多个标签的控件,您可以为每个标签设置属性。这还具有可重复使用的优点。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 但是,如果您设置label.text = "asd" + string;,我不知道您将如何将 bold 与常规分开。
            【解决方案8】:

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

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

            但就像其他人所说的那样,取决于您使用的是什么。

            【讨论】:

              【解决方案9】:

              这取决于你的务实程度。听起来有点矫枉过正,但可以工作的是,在您的表单中使用 Web 浏览器控件,并将 HTML 标记输入其中。正如我所说的标签矫枉过正,但如果你有不止一行需要格式化的文本,它可能是一种选择。 ——H. Abraham Chavez 刚刚编辑

              【讨论】:

              • 拿火箭筒打倒一只蚂蚁?但是,是的,这确实是一种选择。
              【解决方案10】:

              使用 Infragistics 的 UltraLabel 控件 - 它支持 html 格式。可能还有其他第三方解决方案。

              【讨论】:

                【解决方案11】:

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

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

                【讨论】:

                  【解决方案12】:

                  VB.NET 解决方案

                  我接受了@affan's 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
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-08-17
                    • 1970-01-01
                    • 2021-12-31
                    • 2016-08-10
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多