在Windows窗体标签词总结(Word wrap for a label in Windows F

2019-06-17 19:01发布

我们怎样才能自动换行功能在标签Windows窗体 ?

我把一个标签在面板中增加了一些文字,动态标签。 但它超过了面板的长度。 我该如何解决这个问题?

Answer 1:

简单的回答: 关掉 自动调整大小 。

这里最大的问题是,标签不会自动改变其高度(仅宽度)。 为了得到这个权利,你将需要继承的标签,包括垂直调整大小的逻辑。

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

  1. 测量文本(Graphics.MeasureString)的高度。
  2. 如果标签高度不等于文本的高度设置高度和回报。
  3. 绘制文本。

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



Answer 2:

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

如果你的标签设置为自动调整大小,它会自动与您放置任何文本在它成长。 (这包括垂直生长。)

如果你想让它自动换行,在一个特定的宽度,可以设置MAXIMUMSIZE属性。

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

测试和工程。



Answer 3:

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



Answer 4:

坏消息:没有一个autowrap属性。

好消息:我们是在隧道尽头的亮光!

您可以以编程方式做到这一点,以它的大小动态,但在这里是最简单的解决方案:

  • 选择标签的属性
  • 自动调整大小=真
  • MAXIMUMSIZE =其中width =最大尺寸你想要的标签( 宽度高度 )是和身高 =你要多少像素它包



Answer 5:

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


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


Answer 7:

有基于@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; 在这里,我们照顾填充的顶部和底部。



Answer 8:

  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


Answer 9:

不知道它会适合所有的用例,但我经常使用的一个简单的技巧,以获得包装行为:把你的LabelAutoSize=false 1x1的内TableLayoutPanel ,将照顾的Label的尺寸。



Answer 10:

设置AutoEllipsis属性为“TRUE”和AutoSize属性为“假”。



Answer 11:

如果您的面板被限制你的标签的宽度,您可以将标签的Anchor属性设置为左,右,并设置自动调整大小为true。 这在概念上类似于监听小组的SizeChanged事件和更新标签的MAXIMUMSIZE到一个new Size(((Control)sender).Size.Width, 0)所建议前面的回答 。 在Anchor属性中列出的每个侧,那么,锚定到含有控制的各自的内侧。 因此,上市相对的两侧在锚有效地设置控件的尺寸。 锚定到左,右设置控件的宽度属性和锚定到顶部和底部将设置其高度属性。

该解决方案,如C#:

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


Answer 12:

如果你真的想设置标签宽度无关的内容,我觉得最简单的方法是这样的:

  • 设置自动调整大小真
  • 设置最大宽度你想要的
  • 设置最小宽度相同

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

那么对于动态文本,缩小字体大小。 如果有必要,在标签文本设置副使用这个片段:

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


Answer 13:

这帮助我在我的表叫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);
}

我的表格整个代码



Answer 14:

如果按钮的尺寸必须保持不变:

myButton.Text = "word\r\nwrapped"


Answer 15:

这个问题的答案很简单,改变标签的Dock属性。 这是“NONE”默认情况下。



Answer 16:

使用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>


文章来源: Word wrap for a label in Windows Forms