Перенос слов для метки в Windows Forms - PullRequest
175 голосов
/ 30 июля 2009

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

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

Ответы [ 16 ]

338 голосов
/ 10 сентября 2010

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

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

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

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

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

150 голосов
/ 30 июля 2009

Быстрый ответ: переключатель выключен Авторазмер .

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

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

  1. Измерение высоты текста (Graphics.MeasureString).
  2. Если высота надписи не равна высоте текста, установите высоту и вернитесь.
  3. Нарисуйте текст.

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

21 голосов
/ 27 марта 2012

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

16 голосов
/ 14 сентября 2011

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

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

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

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

    Sample Properties

11 голосов
/ 22 сентября 2009

С 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 голосов
/ 26 февраля 2014

Мне нужно было найти быстрое решение, поэтому я просто использовал 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
                    };
3 голосов
/ 10 июня 2016

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

1 голос
/ 27 декабря 2016

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

enter image description here

enter image description here

1 голос
/ 02 октября 2015

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

1 голос
/ 26 марта 2013
  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
...