Перенос слов для ярлыка в Windows Forms

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

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

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

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

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

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

Вам также необходимо установить флаг стиля 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; здесь мы заботимся о прокладке сверху и снизу.

  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

Не уверен, что он подойдет ко всем прецедентам, но я часто использую простой трюк, чтобы получить поведение обертки: поставьте свой 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. Это добавит полосу прокрутки на этикетке внутри панели.

  
  • Как создать пользовательский элемент управления WPF с содержимым NAMED
  • Interesting Posts
    Давайте будем гением компьютера.