Windows窗体中的标签的自动换行

Nag*_*agu 179 .net c# controls label winforms

我们如何在Windows窗体中获得标签的自动换行功能?

我在一个面板中放置了一个标签,并添加了一些动态标签的文字.但它超出了面板长度.我怎么解决这个问题?

Joh*_*zen 343

实际上,接受的答案是不必要的复杂.

如果将标签设置为AutoSize,它将随您放入的任何文本自动增长.(这包括垂直增长.)

如果要使其以特定宽度进行自动换行,可以设置MaximumSize属性.

myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
Run Code Online (Sandbox Code Playgroud)

经过测试和工作.

  • 如果您将标签卡入其容器中,则可以关闭AutoSize,保留max size属性,并且它将完全按照我们的要求进行自动换行.亲吻上班! (9认同)
  • 我已经在父级中锁定了`OnR​​esize`并调用了'myLabel.MaximumSize = new Size(Bounds.Width,0);` (2认同)
  • 我的标签没有 AutoSize 和 MaximumSize 属性,如何添加这些属性? (2认同)

Jon*_*son 155

快速回答:关闭 AutoSize.

这里的一个大问题是标签不会自动改变其高度(仅宽度).为了实现这一点,您需要对标签进行子类化并包含垂直调整大小逻辑.

基本上你在OnPaint中需要做的是:

  1. 测量文本的高度(Graphics.MeasureString).
  2. 如果标签高度不等于文本的高度设置高度并返回.
  3. 画出文字.

您还需要在构造函数中设置ResizeRedraw样式标志.

  • 选择要动态添加文本的标签.查看标签的属性并关闭AutoSize.您现在可以拖动/设置标签的区域,它将自动自动换行以保持在这些参数范围内.无需任何额外的编码. (11认同)

ale*_*555 22

在我的情况下(面板上的标签)我设置label.AutoSize = falselabel.Dock = Fill.标签文本会自动换行.

  • 标签**在面板**上,而不是直接在表格上.因此,文本不超过面板的界限 (4认同)
  • 是什么阻止您创建仅包含标签的额外面板? (2认同)

Seb*_*ldi 16

坏消息:没有autowrap属性.

好消息:隧道尽头有一盏灯!

您可以通过编程方式完成此操作以动态调整大小,但这是最简单的解决方案:

  • 选择标签的属性
  • AutoSize = True
  • MaximumSize =(宽度,高度),其中宽度 =您希望标签的最大尺寸和高度 =您希望它包裹多少像素

    样本属性

  • 还有一点需要注意,如果将最大高度保持为0,它将继续垂直扩展. (4认同)

小智 11

MSDN,自动换行标签中的文本:

using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

public class GrowLabel : Label {
    private bool mGrowing;
    public GrowLabel() {
        this.AutoSize = false;
    }
    private void resizeLabel() {
        if (mGrowing) 
            return;
        try {
            mGrowing = true;
            Size sz = new Size(this.Width, Int32.MaxValue);
            sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
            this.Height = sz.Height;
        }
        finally {
            mGrowing = false;
        }
    }
    protected override void OnTextChanged(EventArgs e) {
        base.OnTextChanged(e);
        resizeLabel();
    }
    protected override void OnFontChanged(EventArgs e) {
        base.OnFontChanged(e);
        resizeLabel();
    }
    protected override void OnSizeChanged(EventArgs e) {
        base.OnSizeChanged(e);
        resizeLabel();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我必须找到一个快速的解决方案,所以我只使用了具有这些属性的TextBox:

var myLabel = new TextBox
                    {
                        Text = "xxx xxx xxx",
                        WordWrap = true,
                        AutoSize = false,
                        Enabled = false,
                        Size = new Size(60, 30),
                        BorderStyle = BorderStyle.None,
                        Multiline =  true,
                        BackColor =  container.BackColor
                    };
Run Code Online (Sandbox Code Playgroud)