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ć?
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.
Testowane i działa.
źródło
Dock
właściwość zarówno etykiety, jak i panelu naTop
, 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
ilabel.Dock = Fill
. Tekst etykiety jest automatycznie zawijany.źródło
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
źródło
Z MSDN , automatycznie zawijaj tekst w etykiecie :
źródło
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:
źródło
Miej lepszy na podstawie odpowiedzi @hypo
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.źródło
Chwyć
ClientSizeChanged event
panel, sprawiając, że etykieta wypełni przestrzeń:Zestaw
Auto-Size
etykietę natrue
Dock
etykietę naFill
źródło
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
doAutoSize=false
środka 1x1,TableLayoutPanel
który zadba oLabel
rozmiar.źródło
Ustaw właściwość AutoEllipsis na „PRAWDA”, a właściwość AutoSize na „FALSE”.
źródło
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ścinew 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 #:
źródło
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:
źródło
Pomogło mi to w moim formularzu o nazwie InpitWindow: In Designer for Label:
Cały kod mojej formy
źródło
Jeśli wymiary przycisku muszą pozostać niezmienione:
źródło
Prostą odpowiedzią na ten problem jest zmiana właściwości DOCK etykiety. Domyślnie jest to „BRAK”.
źródło
źródło
Użyj
style="overflow:Scroll"
w etykiecie jak w poniższym HTML. Spowoduje to dodanie paska przewijania do etykiety w panelu.źródło