首页 文章

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

提问于
浏览
172

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

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

16 回答

  • 19

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

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

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

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

    经过测试和工作 .

  • 1

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

  • 0

    坏消息:没有autowrap属性 .

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

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

    • 选择标签的属性

    • AutoSize = True

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

    Sample Properties

  • 0

    快速回答:切换 off AutoSize .

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

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

    • 测量文本的高度(Graphics.MeasureString) .

    • 如果标签高度不等于文本高度设置的高度并返回 .

    • 绘制文字 .

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

  • 1

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

  • 0

    来自MSDNAutomatically 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();
        }
    }
    
  • 3

    我必须找到一个快速的解决方案,所以我只使用了具有这些属性的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
                        };
    
  • 1

    根据@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; 这里我们负责顶部和底部的填充 .

  • 327
    • 将标签放在面板内

    • 处理面板的 ClientSizeChanged event ,使标签填满空格:

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

    • 为标签设置 DockFill

  • 147

    不确定它是否适合所有用例但我经常使用一个简单的技巧来获取包装行为:将 LabelAutoSize=false 放在1x1 TableLayoutPanel 中,它将处理 Label 的大小 .

  • 14

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

    enter image description here

    enter image description here

  • 11

    如果您的面板限制了标签的宽度,您可以将标签的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;
    
  • 6

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

    • 设置自动调整为真

    • 将最大宽度设置为您想要的宽度

    • 设置相同的最小宽度

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

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

    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
    
  • 0

    这帮我在我的Form InpitWindow:在Designer 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

  • -12

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

    myButton.Text = "word\r\nwrapped"
    
  • 0

    在标签中使用 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>
    

相关问题