it-roy-ru.com

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

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

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

175
Nagu

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

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

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

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

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

150
Jonathan C Dickinson

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

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

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

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

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

336
John Gietzen

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

21
alex555

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

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

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

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

    Sample Properties

16
Sebastian Castaldi

From 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();
    }
}
11
hypo

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

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

3
march1993

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

enter image description here

enter image description here

1
Ravi Kumar G N

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

1
Pragmateek
  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
1
noelicus

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

0
Sunil Neeradi

Если размеры кнопки нужно оставить без изменений:

myButton.Text = "Word\r\nwrapped"
0
rjain

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

  • Установить автоматический размер 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
0
Kjell Verbeke

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

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

0
Mic

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

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

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