Jak możemy uzyskać funkcję zawijania słów dla etykiety w formularzach Windows Forms ?
Umieściłem etykietę w panelu i dynamicznie dodałem tekst do etykiety. Ale przekracza długość panelu. Jak mogę to rozwiązać?
Jak możemy uzyskać funkcję zawijania słów dla etykiety w formularzach Windows Forms ?
Umieściłem etykietę w panelu i dynamicznie dodałem tekst do etykiety. Ale przekracza długość panelu. Jak mogę to rozwiązać?
Odpowiedzi:
Szybka odpowiedź: wyłącz AutoSize .
Dużym problemem jest to, że etykieta nie zmieni automatycznie wysokości (tylko szerokość). Aby uzyskać to prawo, należy podklasować etykietę i uwzględnić logikę zmiany rozmiaru w pionie.
Zasadniczo w OnPaint musisz zrobić:
Będziesz także musiał ustawić flagę stylu ResizeRedraw w konstruktorze.
W rzeczywistości zaakceptowana odpowiedź jest niepotrzebnie skomplikowana.
Jeśli ustawisz etykietę na AutoSize, będzie ona automatycznie powiększać się z każdym umieszczonym w niej tekstem. (Obejmuje to wzrost pionowy).
Jeśli chcesz, aby zawijał słowa o określonej szerokości, możesz ustawić właściwość MaximumSize.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
Testowane i działa.
Dock
właściwość zarówno etykiety, jak i panelu na Top
, zamiast mojego rozwiązania.
OnResize
rodzica i zadzwoniłemmyLabel.MaximumSize = new Size(Bounds.Width, 0);
W moim przypadku (etykieta na panelu) ustawiam label.AutoSize = false
i label.Dock = Fill
. Tekst etykiety jest automatycznie zawijany.
Zła wiadomość: nie ma właściwości automatycznego zawijania.
Dobra wiadomość: na końcu tunelu jest światło!
Możesz to zrobić programowo, aby dynamicznie dopasować rozmiar, ale oto najprostsze rozwiązanie:
MaximumSize = ( szerokość , wysokość ) gdzie Width = maksymalny rozmiar, jaki ma być etykieta, a Height = liczba pikseli, które mają być zawijane
Z MSDN , automatycznie zawijaj tekst w etykiecie :
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;
)
Musiałem znaleźć szybkie rozwiązanie, więc po prostu użyłem TextBox o tych właściwościach:
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
};
Miej lepszy na podstawie odpowiedzi @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;
pozwala to na użycie etykiety automatycznego wzrostu po zadokowaniu do elementu nadrzędnego, np. panelu.
this.Height = sz.Height + Padding.Bottom + Padding.Top;
tutaj dbamy o wypełnienie u góry iu dołu.
Chwyć ClientSizeChanged event
panel, sprawiając, że etykieta wypełni przestrzeń:
private void Panel2_ClientSizeChanged(object sender, EventArgs e)
{
label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
}
Zestaw Auto-Size
etykietę natrue
Dock
etykietę naFill
Nie jestem pewien, czy będzie pasować do wszystkich przypadków użycia, ale często używam prostej sztuczki, aby uzyskać zachowanie owijania: włóż Label
do AutoSize=false
środka 1x1, TableLayoutPanel
który zadba o Label
rozmiar.
Jeśli panel ogranicza szerokość etykiety, możesz ustawić właściwość Anchor etykiety na Left, Right i ustawić AutoSize na true. Jest to koncepcyjnie podobne do nasłuchiwania SizeChanged
zdarzenia panelu i zaktualizowania MaximumSize etykiety do wartości new Size(((Control)sender).Size.Width, 0)
sugerowanej w poprzedniej odpowiedzi . Każda strona wymieniona we właściwości Anchor jest, no cóż, zakotwiczona do odpowiedniej wewnętrznej strony zawierającej Kontroli. Zatem umieszczenie dwóch przeciwnych stron w zakotwiczeniu skutecznie określa wymiar formantu. Zakotwiczenie w lewo i prawo ustawia właściwość Szerokość elementu sterującego, a zakotwiczenie w górę i w dół ustawiłoby właściwość Wysokość.
To rozwiązanie, jako C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
Jeśli naprawdę chcesz ustawić szerokość etykiety niezależnie od treści, uważam, że najłatwiejszym sposobem jest:
Teraz etykieta ma stałą szerokość, ale automatycznie dostosowuje swoją wysokość.
Następnie w przypadku tekstu dynamicznego zmniejsz rozmiar czcionki. W razie potrzeby użyj tego fragmentu kodu w obszarze podrzędnym, w którym ustawiony jest tekst etykiety:
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
Pomogło mi to w moim formularzu o nazwie 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);
}
Prostą odpowiedzią na ten problem jest zmiana właściwości DOCK etykiety. Domyślnie jest to „BRAK”.
Jeśli wcześniej wpisujesz tekst do etykiety, możesz to zrobić.
Użyj style="overflow:Scroll"
w etykiecie jak w poniższym HTML. Spowoduje to dodanie paska przewijania do etykiety w panelu.
<asp:Label
ID="txtAOI"
runat="server"
style="overflow:Scroll"
CssClass="areatext"
BackColor="White"
BorderColor="Gray"
BorderWidth="1"
Width = "900" ></asp:Label>