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

时间:2009-07-30 06:33:12

标签: c# .net winforms label controls

我们如何在Windows Forms中为标签获取自动换行功能?

我在面板中放置了一个标签,并动态添加了一些标签。但它超出了面板长度。我该如何解决这个问题?

19 个答案:

答案 0 :(得分:334)

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

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

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

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

经过测试和工作。

答案 1 :(得分:149)

快速回答:切换关闭 AutoSize

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

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

  1. 测量文本的高度(Graphics.MeasureString)。
  2. 如果标签高度不等于文本的高度,则设置高度并返回。
  3. 绘制文字。
  4. 您还需要在构造函数中设置ResizeRedraw样式标志。

答案 2 :(得分:21)

就我而言(面板上的标签),我设置了label.AutoSize = falselabel.Dock = Fill。 标签文本会自动换行。

答案 3 :(得分:16)

坏消息:没有自动装置属性。

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

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

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

    Sample Properties

答案 4 :(得分:11)

来自MSDN Automatically Wrap Text in Label

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();
    }
}

答案 5 :(得分: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
                    };

答案 6 :(得分:3)

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

int width = this.Parent == null ? this.Width : this.Parent.Width;

this.Height = sz.Height + Padding.Bottom + Padding.Top;这允许您在停靠父母时使用自动增长标签,例如小组。

{{1}}我们在这里处理顶部和底部的填充。

答案 7 :(得分:1)

  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-Size设置为true

  4. 将标签Dock设置为Fill

答案 8 :(得分:1)

不确定它是否适合所有用例但我经常使用一个简单的技巧来获取包装行为: 将LabelAutoSize=false放在1x1 TableLayoutPanel内,这将照顾Label的尺寸。

答案 9 :(得分:1)

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

enter image description here

enter image description here

答案 10 :(得分:0)

如果您的面板限制了标签的宽度,您可以将标签的Anchor属性设置为Left,Right并将AutoSize设置为true。这在概念上类似于收听Panel的SizeChanged事件,并按照a previous answer的建议将标签的MaximumSize更新为new Size(((Control)sender).Size.Width, 0)。 Anchor属性中列出的每一方都锚定到包含Control的相应内侧。因此,在Anchor中列出两个相反的方面可以有效地设置控件的维度。锚定到Left和Right设置Control的Width属性,Anchoring to Top和Bottom将设置其Height属性。

此解决方案,如C#:

label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;

答案 11 :(得分:0)

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

  • 设置autosize true
  • 将最大宽度设置为您想要的宽度
  • 设置相同的最小宽度

现在标签的宽度不变,但它会自动调整高度。

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

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

答案 12 :(得分:0)

这在我的名为InpitWindow的表格中帮助了我: 在Label for Label中:

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);
}

Whole code of my form

答案 13 :(得分:0)

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

myButton.Text = "word\r\nwrapped"

答案 14 :(得分:0)

此问题的简单答案是更改Label的DOCK属性。它是&#34; NONE&#34;默认情况下。

答案 15 :(得分:0)

如果您要预先在标签中输入文字,则可以这样做。

  1. 在设计师中, 右键单击标签,然后单击属性。
  2. 在“属性”中,搜索“文本”选项卡。
  3. 单击选项卡,然后单击其旁边的箭头按钮。
  4. 将在其顶部弹出一个框。
  5. 您可以在弹出框中按Enter来添加行,并像在记事本中一样键入! (在要包装标签文本的地方按Enter键)

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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

标签(在 tablelayoutpanel 中)Autosize = True。

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

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

答案 18 :(得分:-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>