Перенос слов для ярлыка в Windows Forms
Как мы можем получить функциональность переноса слов для ярлыка в Windows Forms ?
Я поместил метку в панель и добавил динамический текст. Но он превышает длину панели. Как я могу это решить?
- Как получить доступ к управлению текстовым полем Winform из другого classа?
- Общие элементы в двух списках
- Лучший способ получить доступ к элементу управления в другой форме в Windows Forms?
- Что такое разработка, основанная на компонентах?
- Неразрешенный внешний символ для статических членов classа
- В чем разница между атрибутами classа и экземпляра?
- Найти элемент управления в Windows Forms по имени
- Виртуализация элемента управления ItemsControl?
- C # Получить позицию элемента управления в форме
- Как получить доступ к элементу управления формы для другой формы?
- Android ListView с элементами onClick
- В чем разница между User Control, Custom Control и Component?
- Почему элементы управления не хотят удаляться?
Быстрый ответ: отключите AutoSize .
Большая проблема заключается в том, что метка не будет автоматически изменять ее высоту (только ширина). Чтобы получить это право, вам нужно подclassифицировать метку и включить вертикальную логику изменения размера.
В основном, что нужно сделать в OnPaint:
- Измерьте высоту текста (Graphics.MeasureString).
- Если высота метки не равна высоте текста, установите высоту и возврат.
- Нарисуйте текст.
Вам также необходимо установить флаг стиля ResizeRedraw в конструкторе.
Собственно, принятый ответ излишне усложнен.
Если вы установите метку в AutoSize, она будет автоматически расти с любым текстом, который вы в нее вставляете. (Это включает в себя вертикальный рост.)
Если вы хотите сделать перенос слов определенной шириной, вы можете установить свойство MaximumSize.
myLabel.MaximumSize = new Size(100, 0); myLabel.AutoSize = true;
Протестировано и работает.
В моем случае (метка на панели) я установил label.AutoSize = false
и label.Dock = Fill
. И текст ярлыка автоматически завернут.
Плохая новость: нет свойства autowrap.
Хорошая новость: в конце туннеля светит!
Вы можете выполнить это программно, чтобы его динамически изменять, но вот самое простое решение:
- Выберите свойства метки
- AutoSize = True
-
MaximumSize = ( ширина , высота ), где Width = максимальный размер, который вы хотите, чтобы метка была, и Height = количество пикселей, которое вы хотите обернуть
Из 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 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
Не уверен, что он подойдет ко всем прецедентам, но я часто использую простой трюк, чтобы получить поведение обертки: поставьте свой Label
с AutoSize=false
внутри TableLayoutPanel
размером 1×1, которая позаботится о размере Label
.
Установите для свойства AutoEllipsis значение «TRUE» и «AutoSize» для «FALSE».
Если ваша панель ограничивает ширину вашего ярлыка, вы можете установить свойство Anchor на ярлыке влево, вправо и установить значение AutoSize в значение true. Это концептуально похоже на прослушивание события SizeChanged
Panel и обновление SizeChanged
метки new Size(((Control)sender).Size.Width, 0)
как это было предложено в предыдущем ответе . Каждая сторона, перечисленная в свойстве Anchor, хорошо привязана к соответствующей внутренней стороне Control Control. Таким образом, перечисление двух противоположных сторон в Anchor эффективно устанавливает размер элемента управления. Закрепление влево и вправо устанавливает свойство «Ширина элемента управления», а «Закрепление до верхнего и нижнего» задает свойство «Высота».
Это решение, как C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right; label.AutoSize = true;
Если вы действительно хотите установить ширину метки независимо от содержимого, я считаю, что самый простой способ:
- Установить autosize true
- Установите максимальную ширину так, как вы хотите.
- Установите минимальную ширину одинаково
Теперь метка имеет постоянную ширину, но она автоматически адаптирует ее высоту.
Затем для динамического текста уменьшите размер шрифта. Если необходимо, используйте этот fragment в субэлементе, где установлен текст метки:
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: In 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. Это добавит полосу прокрутки на этикетке внутри панели.