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


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

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

16 164

16 ответов:

быстрый ответ: switch выклАвторазмер.

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

в основном то, что вам нужно сделать в 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
  • Максимальный_размер = (ширина,Высота), где ширина = максимальный размер вы хотите, чтобы метка была и Высота = сколько пикселей вы хотите, чтобы обернуть

    Sample Properties

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

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

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 событие и обновление максимального размера метки до new Size(((Control)sender).Size.Width, 0) как было предложено предыдущий ответ. Каждая сторона, указанная в свойстве Anchor, хорошо привязана к соответствующей внутренней стороне содержащего элемента управления. Таким образом, перечисление двух противоположных сторон в Якоре эффективно устанавливает размерность контроля. Привязка к левой и правой устанавливает свойство ширины элемента управления, а привязка к верхней и нижней установит его свойство высоты.

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

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

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

  • установить свойство 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

это помогло мне в моей форме под названием 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 метки. Это" нет " по умолчанию.

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