Перенос слов для ярлыка в Windows Forms

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

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

Ответ 1

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

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

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

  • Измерьте высоту текста (Graphics.MeasureString).
  • Если высота метки не равна высоте текста, установите высоту и значение возврата.
  • Нарисуйте текст.

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

Ответ 2

Собственно, принятый ответ излишне усложнен.

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

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

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

Протестировано и работает.

Ответ 3

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

Ответ 4

Плохая новость: нет свойства autowrap.

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

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

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

    Sample Properties

Ответ 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();
    }
}

Ответ 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
                    };

Ответ 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

  • Поместите ярлык внутри панели
  • Обращайтесь к панели ClientSizeChanged event для панели, метка заполнить пробел:

    private void Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
        label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
    }
    
  • Установите Auto-Size для метки true

  • Установите Dock для метки Fill

Ответ 9

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

Ответ 10

Задайте для свойства AutoEllipsis значение TRUE и свойство AutoSize для FALSE.

введите описание изображения здесь

введите описание изображения здесь

Ответ 11

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

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

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

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

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

myButton.Text = "word\r\nwrapped"

Ответ 15

Используйте 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>