Як можна отримати функцію обгортання слів для мітки в Windows Forms ?
Я помістив мітку на панель і додав текст, щоб динамічно мітити. Але вона перевищує довжину панелі. Як я можу це вирішити?
Як можна отримати функцію обгортання слів для мітки в Windows Forms ?
Я помістив мітку на панель і додав текст, щоб динамічно мітити. Але вона перевищує довжину панелі. Як я можу це вирішити?
Відповіді:
Швидка відповідь: вимкніть автоматичний розмір .
Велика проблема тут полягає в тому, що мітка не змінить свою висоту автоматично (лише ширина). Щоб отримати це право, вам потрібно буде підкласировать мітку та включити логіку вертикального розміру.
В основному, що вам потрібно зробити в OnPaint, це:
Вам також потрібно буде встановити прапор стилю ResizeRedraw у конструкторі.
Власне, прийнята відповідь є надмірно складним.
Якщо ви встановите мітку на AutoSize, вона автоматично зростатиме разом із текстом, який ви додаєте до неї. (Сюди входить вертикальний ріст.)
Якщо ви хочете зробити обертання слів на певну ширину, ви можете встановити властивість MaximumSize.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
Тестується і працює.
Dock
властивість як етикетки, так і панелі Top
замість мого рішення.
OnResize
у батьків і зателефонувавmyLabel.MaximumSize = new Size(Bounds.Width, 0);
У моєму випадку (мітка на панелі) я встановив label.AutoSize = false
і label.Dock = Fill
. І текст етикетки загортається автоматично.
Погана новина: немає властивості автозагорнути.
Хороша новина: у кінці тунелю є світло!
Ви можете виконати це програмно, щоб динамічно розмістити його, але ось найпростіше рішення:
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();
}
}
Height = sz.Height + Padding.Vertical;
)
Мені довелося знайти швидке рішення, тому я просто використав 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
всередині 1x1 , TableLayoutPanel
який буде дбати про Label
розмірі «s.
Встановіть для властивості AutoEllipsis значення "TRUE", а для властивості AutoSize - значення "FALSE".
Якщо ваша панель обмежує ширину вашої мітки, ви можете встановити властивість якоря мітки вліво, вправо та встановити значення AutoSize на значення true. Це концептуально схоже на прослуховування SizeChanged
події групи та оновлення ярлика MaximumSize до рівня, new Size(((Control)sender).Size.Width, 0)
як було запропоновано попередньою відповіддю . Кожна сторона, зазначена у властивості Якір, добре прив’язана до відповідної внутрішньої сторони Control. Таким чином, перерахування двох протилежних сторін у Якорі ефективно встановлює розмірність управління. Прив’язка ліворуч та праворуч встановлює властивість Ширина управління, а Анкерна доверху та знизу встановлюватиме властивість Висота.
Це рішення, як C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.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: 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);
}
Проста відповідь на цю проблему полягає у зміні властивості DOCK Label. За замовчуванням це "NONE".
Якщо ви заздалегідь вводите текст у мітку, ви можете це зробити.
Використовуйте 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>