Перенос слов для метки в Windows Forms
Как мы можем получить функцию переноса слов для метки в Windows Forms?
Я поместил метку в панель и добавил текст для динамической метки. Но он превышает длину панели. Как я могу решить эту проблему?
16 ответов:
быстрый ответ: switch выклАвторазмер.
большая проблема здесь заключается в том, что метка не будет автоматически менять свою высоту (только ширина). Чтобы получить это право, вам нужно будет подкласс метки и включить вертикальную логику изменения размера.
в основном то, что вам нужно сделать в OnPaint:
- Измерьте высоту текста (графика.MeasureString).
- если высота метки не равна высоте в тексте задается высота и возврат.
- рисовать текст.
вам также нужно будет установить ResizeRedraw флаг стиля в конструкторе.
на самом деле, принятый ответ излишне сложен.
Если вы установите метку в Авторазмер, она будет автоматически расти с любым текстом, который вы в нее вставляете. (Это включает в себя вертикальный рост.)
Если вы хотите сделать перенос слов на определенную ширину, вы можете установить свойство MaximumSize.
myLabel.MaximumSize = new Size(100, 0); myLabel.AutoSize = true;
проверено и работает.
в моем случае (метка на панели) я установил
label.AutoSize = false
иlabel.Dock = Fill
. И текст ярлыка оборачивается автоматически.
плохие новости: свойство autowrap отсутствует.
хорошие новости: есть свет в конце туннеля!
вы можете сделать это программно, чтобы размер его динамически, но вот самое простое решение:
- выберите Свойства метки
- AutoSize = 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(); } }
Мне нужно было найти быстрое решение, поэтому я просто использовал текстовое поле с этими свойствами:
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;
здесь мы позаботимся о прокладке сверху и снизу.
- поместите этикетку внутри панели
обработки
ClientSizeChanged event
панели, что делает метка заполнить пространство:private void Panel2_ClientSizeChanged(object sender, EventArgs e) { label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000); }
Set
Auto-Size
для меткиtrue
- Set
Dock
для меткиFill
не уверен, что он подойдет для всех случаев использования, но я часто использую простой трюк, чтобы получить поведение упаковки: положите ваш
Label
сAutoSize=false
внутри 1x1TableLayoutPanel
который будет заботиться оLabel
's размер.
Если ваша панель ограничивает ширину вашей метки, Вы можете установить свойство привязки метки влево, вправо и установить 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); }