Перенос слов для метки в Windows Forms
Вопрос
Как мы можем получить функциональность переноса слов для метки в Формы Windows?
Я поместил метку на панель и добавил немного текста для динамической маркировки.Но это превышает длину панели.Как я могу решить эту проблему?
Решение
Быстрый ответ: выключите Авторазмер .
Большая проблема в том, что метка не изменит свою высоту автоматически (только ширина). Чтобы сделать это правильно, вам нужно будет создать подкласс метки и включить логику вертикального изменения размера.
В основном вам нужно сделать в OnPaint:
<Ол>Вам также необходимо установить Флаг стиля ResizeRedraw в конструкторе.
Другие советы
На самом деле принятый ответ неоправданно сложен.
Если вы установите метку в AutoSize, она будет автоматически расти с любым текстом, который вы в нее вставите. (Это включает вертикальный рост.)
Если вы хотите сделать перенос слов на определенную ширину, вы можете установить свойство MaximumSize.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
Протестировано и работает.
В моем случае (метка на панели) я установил label.AutoSize = false
и label.Dock = Fill
.
И текст метки переносится автоматически.
Плохие новости:свойства autowrap не существует.
Хорошие новости:в конце туннеля есть свет!
Вы могли бы выполнить это программно, чтобы изменять его размер динамически, но вот самое простое решение:
- Выберите свойства метки
- Автоматический размер = True
Максимальный размер = (Ширина, Высота) где Ширина = максимальный размер, который вы хотите, чтобы была метка, и Высота = сколько пикселей вы хотите обернуть
От 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();
}
}
Мне нужно было найти быстрое решение, поэтому я просто использовал 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
};
Выберите лучший вариант, основываясь на ответе @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;
здесь мы позаботимся о заполнении сверху и снизу.
Обработайте событие ClientSizeChanged
для панели, сделав
метка заполнить пробел:
private void Panel2_ClientSizeChanged(object sender, EventArgs e)
{
label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
}
Установите для Авторазмера
для метки значение true
Dock
метки значение Fill
Не уверен, что он подойдет для всех вариантов использования, но я часто использую простой трюк, чтобы получить поведение обтекания:
поместите свою Label
с AutoSize = false
в 1x1 TableLayoutPanel
, который позаботится о размере Label
. р>
Если ваша панель ограничивает ширину вашей метки, вы можете установить свойство привязки метки на Left, Right и установить AutoSize на true. Концептуально это аналогично прослушиванию события Panel SizeChanged и обновлению MaximumSize метки до нового размера (((Control) отправителя) .Size.Width, 0)
в соответствии с предыдущим ответом . Каждая сторона, указанная в свойстве Anchor, хорошо привязана к соответствующей внутренней стороне содержащего элемента управления. Таким образом, перечисление двух противоположных сторон в Anchor эффективно устанавливает размер элемента управления. Привязка к левому и правому краям устанавливает свойство Control's Width, а привязка к верхнему и нижнему элементам устанавливает его свойство Height.
Это решение, как C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
Если вы действительно хотите установить ширину метки независимо от содержимого, я считаю, что самый простой способ заключается в следующем:
- Установите автоматический размер 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: В 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);
}
Если размеры кнопки нужно оставить без изменений:
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>