199

Label如何为超出范围的文本获得自动换行功能?

4

19 回答 19

374

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

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

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

myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;

测试和工作。

于 2010-09-09T21:06:46.023 回答
176

快速回答:关闭 AutoSize

这里最大的问题是标签不会自动改变它的高度(只有宽度)。要做到这一点,您需要对标签进行子类化并包括垂直调整大小逻辑。

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

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

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

于 2009-07-30T06:37:06.083 回答
25

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

于 2012-03-27T07:58:03.007 回答
22

没有自动换行属性,但这可以通过编程来动态调整大小。这是一种解决方案:

  • 选择标签的属性

  • AutoSize=True

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

    样本属性

于 2011-09-14T17:02:32.770 回答
13

来自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();
    }
}
于 2009-09-22T13:06:29.347 回答
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
                    };
于 2014-02-26T15:53:32.020 回答
3

根据@hypo 的回答有一个更好的

public class GrowLabel : Label {
    private bool mGrowing;
    public GrowLabel() {
        this.AutoSize = false;
    }
    private void resizeLabel() {
        if (mGrowing)
            return;
        try {
            mGrowing = true;
            int width = this.Parent == null ? this.Width : this.Parent.Width;

            Size sz = new Size(this.Width, Int32.MaxValue);
            sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
            this.Height = sz.Height + Padding.Bottom + Padding.Top;
        } 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();
    }
}

int width = this.Parent == null ? this.Width : this.Parent.Width;这允许您在停靠到父级(例如面板)时使用自动增长标签。

this.Height = sz.Height + Padding.Bottom + Padding.Top;在这里,我们负责顶部和底部的填充。

于 2016-06-10T13:13:56.150 回答
2
  1. 将标签放在面板内

  2. 处理ClientSizeChanged event面板,使标签填充空间:

    private void Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
        label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
    }
    
  3. 将标签设置Auto-Sizetrue

  4. 将标签设置DockFill

除了第 2 步之外的所有操作通常都在设计器窗口中完成。

于 2013-03-26T15:20:35.103 回答
1

将 AutoEllipsis 属性设置为“TRUE”,将 AutoSize 属性设置为“FALSE”。

在此处输入图像描述

在此处输入图像描述

于 2016-12-27T06:19:34.490 回答
1

不确定它是否适合所有用例,但我经常使用一个简单的技巧来获得包装行为:将你的LabelwithAutoSize=false放在一个 1x1TableLayoutPanel中,这将照顾Label's 的大小。

于 2015-10-02T14:31:31.773 回答
0

如果按钮的尺寸需要保持不变:

myButton.Text = "word\r\nwrapped"
于 2014-08-29T13:32:02.123 回答
0

如果您的面板限制了标签的宽度,您可以将标签的 Anchor 属性设置为 Left、Right 并将 AutoSize 设置为 true。这在概念上类似于侦听 Panel 的SizeChanged事件并将标签的 MaximumSize 更新为 a如先前的答案new Size(((Control)sender).Size.Width, 0)所建议的那样。Anchor 属性中列出的每一侧都锚定到包含控件的相应内侧。所以在 Anchor 中列出两个相对的边有效地设置了控件的维度。Anchoring to Left 和 Right 设置控件的 Width 属性,而 Anchoring to Top 和 Bottom 将设置它的 Height 属性。

此解决方案,如 C#:

label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
于 2013-01-30T16:10:24.213 回答
0

如果你真的想设置独立于内容的标签宽度,我发现最简单的方法是这样的:

  • 设置自动大小为真
  • 将最大宽度设置为您想要的
  • 相同地设置最小宽度

现在标签的宽度是恒定的,但它会自动调整其高度。

然后对于动态文本,减小字体大小。如有必要,请在设置标签文本的 sub 中使用此代码段:

If Me.Size.Height - (Label12.Location.Y + Label12.Height) < 20 Then
    Dim naam As String = Label12.Font.Name
    Dim size As Single = Label12.Font.SizeInPoints - 1
    Label12.Font = New Font(naam, size)
End If
于 2013-12-08T11:07:46.367 回答
0

这在我的名为 InpitWindow 的表单中帮助了我:在标签设计器中:

AutoSize = true;
Achors = Top, Left, Right.

private void InputWindow_Shown(object sender, EventArgs e) {
    lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left - btOK.Margin.Right -
        lbCaption.Margin.Right - lbCaption.Margin.Left, 
        Screen.GetWorkingArea(this).Height / 2);
    this.Height = this.Height + (lbCaption.Height - btOK.Height - btCancel.Height);
    //Uncomment this line to prevent form height chage to values lower than initial height
    //this.MinimumSize = new Size(this.MinimumSize.Width, this.Height);
}
//Use this handler if you want your label change it size according to form clientsize.
private void InputWindow_ClientSizeChanged(object sender, EventArgs e) {
    lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left * 2 - btOK.Margin.Right * 2 -
        lbCaption.Margin.Right * 2 - lbCaption.Margin.Left * 2,
        Screen.GetWorkingArea(this).Height / 2);
}

我的表格的完整代码

于 2014-08-13T09:53:22.637 回答
0

如果您事先在标签中输入文本,您可以这样做。

  1. 在设计器中,右键单击标签并单击属性。
  2. 在属性中,搜索文本选项卡。
  3. 单击选项卡,然后单击它旁边的箭头按钮。
  4. 上面会弹出一个框。
  5. 您可以在弹出框中按回车添加行并像在记事本中一样输入!(在您要包装标签文本的位置按 ENTER)
于 2020-03-11T13:42:36.333 回答
0

我有一个标签,可以在右侧停靠的自动调整大小面板中自动换行并增长到任何大小,其宽度由其他内容设置。

标签(在 tablelayoutpanel 中) Autosize = True。

TableLayoutPanel(在面板中)Autosize = True,AutoSizeMode = GrowAndShrink,Dock = Bottom,一个 Column SizeType = 100%,一个 Row SizeType = 100%。

面板(右侧停靠在表单中)AutoSize = True,AutoSizeMode = GrowAndShrink,Dock = Right。

于 2021-07-18T18:19:16.997 回答
0

这个问题的简单答案是更改标签的 DOCK 属性。默认为“无”。

于 2018-02-22T11:26:54.287 回答
0

我建议将AutoEllipsislabel 的属性设置为trueAutoSizeto false。如果文本长度超过标签边界,它会(...)在末尾添加三个点,并自动将完整文本设置为工具提示。因此,用户可以通过将鼠标悬停在标签上来查看完整的文本。

于 2021-01-13T12:32:22.573 回答
-12

style="overflow:Scroll"在标签中使用,如下面的 HTML。这将在面板内的标签中添加滚动条。

<asp:Label
    ID="txtAOI"
    runat="server"
    style="overflow:Scroll"
    CssClass="areatext"
    BackColor="White"
    BorderColor="Gray"
    BorderWidth="1"
    Width = "900" ></asp:Label>
于 2012-02-10T10:35:22.913 回答