【问题标题】:Word wrap for a label in Windows FormsWindows 窗体中标签的自动换行
【发布时间】:2010-11-15 08:15:08
【问题描述】:

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

【问题讨论】:

    标签: c# .net winforms label controls


    【解决方案1】:

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

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

    如果你想让它以特定宽度自动换行,你可以设置MaximumSize属性。

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

    经过测试并且有效。

    【讨论】:

    • 如果你有标签卡入它的容器,你可以关闭 AutoSize,保持最大尺寸属性不变,它会完全按照我们想要的方式自动换行。在工作中亲吻!
    • 您无法使用该解决方案实现流体宽度。
    • @Sam:是的,您可以,您只需设置正确的“锚”属性。你试过了吗?
    • Sam:您应该能够将标签和面板的Dock 属性设置为Top,而不是我的解决方案。
    • 我已锁定父级中的OnResize 并致电myLabel.MaximumSize = new Size(Bounds.Width, 0);
    【解决方案2】:

    快速回答:关闭关闭 AutoSize

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

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

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

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

    【讨论】:

    • 选择您要动态添加文本的标签。查看标签的属性并关闭 AutoSize。您现在可以拖动/设置标签区域,它会自动自动换行以保持在这些参数内。无需任何额外的编码。
    • 这正是我一直在寻找的,因为它与使用段落形式的解释性文本格式化我的表单有关。
    • @madeFromCode 如果您希望标签垂直扩展,您需要以编程方式设置高度,否则您的文本将被剪裁。
    【解决方案3】:

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

    【讨论】:

    • 这会使标签填满整个表单,并使其隐藏表单中的所有其他控件...也就是说,它似乎不起作用。是否有其他要求不能填满整个表格?
    • 标签在面板上,而不是直接在表单上。因此文本不会超出面板的边界
    • 好的,但它不会掩盖面板中的所有其他控件吗?
    • 是什么阻止您创建仅包含标签的额外面板?
    • 这似乎是一些不必要的额外布局。当然,标签应该有自己的盒子,而不是需要放在另一个盒子里。
    【解决方案4】:

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

    • 选择标签的属性

    • AutoSize = True

    • MaximumSize = (Width, Height) 其中 Width = 您希望标签的最大尺寸和 Height = 你希望它包裹多少像素

    【讨论】:

    • 再注意一点,如果将最大高度保留为0,它将继续垂直扩展。
    • 我的标签没有 AutoSize 和 MaximumSize 属性,如何添加这些?
    【解决方案5】:

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

    【讨论】:

    • 为了打破字符而不是单词(当你有没有空格的长字符串时很有用,例如文件路径),请改用 (TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl)。请参阅同一 MSDN 线程中的最后一篇文章。
    • 另外,不要忘记在计算中包含标签的顶部和底部填充 (Height = sz.Height + Padding.Vertical;)
    【解决方案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
                        };
    

    【讨论】:

    • 这是一个很好的解决方案,但我可能更喜欢使用 ReadOnly 而不是将 Enabled 设置为 false。
    • 这是一个富有想象力的解决方案,也适用于 Compact Framework(其中 Label 没有 AutoSize 和 MaximumSize 属性)。
    【解决方案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; 在这里我们负责顶部和底部的填充。

    【讨论】:

      【解决方案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

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

      【讨论】:

      • 第 3 步和第 4 步是否在设计器中完成?为什么它们是第 3 步和第 4 步?
      • 它们是在设计器中完成的(但如果您需要,也可以在代码中完成)并且没有理由订购。
      【解决方案9】:

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

      【讨论】:

        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

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

          此解决方案,如 C#:

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

          【讨论】:

          • 不起作用。标签增加了我的面板的宽度,只是它不必换行。不幸的是,窗户没有那么宽。
          【解决方案12】:

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

          • 设置自动调整大小为真
          • 根据需要设置最大宽度
          • 同样设置最小宽度

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

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

          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
          

          【讨论】:

            【解决方案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);
            }
            

            Whole code of my form

            【讨论】:

              【解决方案14】:

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

              myButton.Text = "word\r\nwrapped"
              

              【讨论】:

                【解决方案15】:

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

                【讨论】:

                  【解决方案16】:

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

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

                  【讨论】:

                    【解决方案17】:

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

                    【讨论】:

                      【解决方案18】:

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

                      标签(在 tablelayoutpanel 中)Autosize = True。

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

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

                      【讨论】:

                        【解决方案19】:

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

                        【讨论】:

                        • 投反对票很好,但至少要说明你为什么这么做。这被否决的原因是因为在 WinForms 中没有使用
                        • 因为是asp.net而不是winform
                        猜你喜欢
                        • 2021-09-26
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-08-14
                        • 1970-01-01
                        • 2012-01-04
                        • 2011-08-23
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多