Перенос слов для метки в Windows Forms

Как мы можем получить функциональность word wrap для метки в Windows Forms?

Я разместил метку на панели и добавил текст для динамической метки. Но она превышает длину панели. Как я могу это решить?

16 ответов


быстрый ответ: переключатель выкл AutoSize.

большая проблема здесь в том, что метка не будет автоматически изменять свою высоту (только ширину). Чтобы получить это право, вам нужно будет подкласс метки и включить логику вертикального изменения размера.

в основном, что вам нужно сделать в OnPaint:

  1. измерение высоты текста (графика.MeasureString).
  2. если высота ярлыка не равна высоте текст устанавливает высоту и возврат.
  3. рисовать текст.

Вам также нужно будет установить ResizeRedraw флаг стиля в конструкторе.


на самом деле, принятый ответ излишне сложен.

Если вы установите метку для автоматической настройки, она будет автоматически расти с любым текстом, который вы в нее поместите. (Это включает вертикальный рост.)

Если вы хотите сделать его переносом слов на определенную ширину, вы можете установить свойство MaximumSize.

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

проверено и работает.


в моем случае (метка на панели) я установил label.AutoSize = false и label.Dock = Fill. И текст ярлыка обернут автоматически.


плохие новости: нет свойства autowrap.

хорошие новости: есть свет в конце туннеля!

вы можете выполнить это программно для динамического размера, но вот самое простое решение:

  • выберите Свойства метки
  • AutoSize = True
  • MaximumSize = (ширина, Высота), где ширина = максимальный размер вы хотите ярлык быть и Высота = сколько пикселей вы хотите, чтобы обернуть

    Sample Properties


С MSDN, автоматически обернуть текст в 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();
    }
}

Мне нужно было найти быстрое решение, поэтому я просто использовал текстовое поле с этими свойствами:

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

есть лучший, основанный на ответе @hypo ' s

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; здесь мы позаботимся о прокладке для верхней части и дна.


  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. Set Auto-Size для метки true

  4. Set Dock для метки Fill

не уверен, что он будет соответствовать всем прецедентам, но я часто использую простой трюк, чтобы получить поведение упаковки: положите ваш Label с AutoSize=false внутри 1x1 TableLayoutPanel который позаботится о Label's размер.


установите для свойства AutoEllipsis значение "TRUE", а для свойства AutoSize - "FALSE".

enter image description here

enter image description here


Если ваша панель ограничивает ширину вашей метки, Вы можете установить свойство привязки метки влево, вправо и установить AutoSize в true. Это концептуально похоже на прослушивание панели SizeChanged событие и обновление MaximumSize метки до new Size(((Control)sender).Size.Width, 0) как было предложено предыдущий ответ. Каждая сторона, перечисленная в свойстве Anchor, хорошо привязана к соответствующей внутренней стороне содержащего элемента управления. Таким образом, перечисление двух противоположных сторон в Anchor эффективно устанавливает измерение контроля. Привязка слева и справа задает свойство Width элемента управления, а привязка сверху и снизу-свойство Height.

Это решение, как C#:

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

Если вы действительно хотите установить ширину метки независимо от содержимого, я считаю, что самый простой способ:

  • установить autosize true
  • установить максимальную ширину, как вы хотите это
  • установить минимальную ширину тож

теперь метка имеет постоянную ширину, но она автоматически адаптирует свою высоту.

затем для динамического текста уменьшите размер шрифта. При необходимости используйте этот фрагмент в подразделе, где находится текст метки set:

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

это помогло мне в моей форме под названием 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);
}

весь код моей формы


Если размеры кнопки необходимо сохранить без изменений:

myButton.Text = "word\r\nwrapped"

простым ответом на эту проблему является изменение свойства DOCK метки. По умолчанию это "NONE".


использовать 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>