Jak utrzymać etykietę wyśrodkowaną w WinForms?

137

W WinFormsużywam a Labeldo wyświetlania różnych komunikatów, takich jak sukces, porażka itp.

Chciałbym wyśrodkować tę etykietę w środkowej formie. Potrzebuję rozwiązania, które utrzyma go w centrum, niezależnie od tego, czy na etykiecie jest tylko jedno słowo, czy całe zdanie.

haansi
źródło

Odpowiedzi:

281

Zestaw Labeljest AutoSizenieruchomość do False, TextAlignwłaściwość do MiddleCenteri Dockwłaściwość do Fill.

decyklon
źródło
dzięki decyclone, zadziałało. czy u plz można poprowadzić, co robi Dock?
haansi
3
Za pomocą Control.Dockwłaściwości ( msdn.microsoft.com/en-us/library/… ) można zadokować (przykleić) kontrolkę do określonej strony kontenera. Na przykład Left, Top, Rightlub Bottom. Fillinformuje układ sterujący, aby zajął całe dostępne miejsce w kontenerze.
decyklon
1
Jeśli nie chcesz, aby etykieta wypełniała całe dostępne miejsce, możesz ustawić właściwość Dock na „Brak”, zgodnie z sugestią użytkownika3866622 w jego rozwiązaniu programistycznym.
Tim,
3
Działało, ale nie musiałem nic robić z tym Dockustawieniem.
Jim Fell
4
Dockustawienie było niepotrzebne. Zmiana AutoSizewłaściwości nadaje etykiecie obwiednię, której rozmiar można ręcznie dostosować.
Nick Roberts
13

Drobna dodatkowa zawartość do ustawiania programowego:

Label textLabel = new Label() { 
        AutoSize = false, 
        TextAlign = ContentAlignment.MiddleCenter, 
        Dock = DockStyle.None, 
        Left = 10, 
        Width = myDialog.Width - 10
};            

Styl dokowania i wyrównanie zawartości mogą różnić się od Twoich potrzeb. Na przykład dla prostej etykiety w formularzu wpf używam DockStyle.None.

user3866622
źródło
12

Osiągniesz to ustawiając właściwość Anchor: None.

Sebastian Xawery Wiśniowiecki
źródło
10

Jeśli nie chcesz zadokować etykiety w całym dostępnym obszarze, po prostu ustaw zdarzenie SizeChanged zamiast TextChanged. Zmiana każdej litery spowoduje zmianę właściwości szerokości etykiety, a także jej tekstu, gdy właściwość automatycznego rozmiaru jest ustawiona na True. Tak więc, przy okazji, możesz użyć dowolnej formuły, aby zachować wyśrodkowanie etykiety w formie.

private void lblReport_SizeChanged(object sender, EventArgs e)
{
    lblReport.Left = (this.ClientSize.Width - lblReport.Size.Width) / 2;
}
Umut OVECOGLU
źródło
2

Zaakceptowana odpowiedź nie zadziałała dla mnie z dwóch powodów:

  1. Miałem BackColortak ustawiony, ustawienia AutoSize = falsei Dock = Fillpowoduje, że kolor tła, aby wypełnić cały formularz
  2. I tak nie mogłem AutoSizeustawić na fałsz, ponieważ tekst mojej etykiety był dynamiczny

Zamiast tego po prostu użyłem szerokości formularza i szerokości etykiety do obliczenia lewego przesunięcia:

MyLabel.Left = (this.Width - MyLabel.Width) / 2;
TheIronCheek
źródło
1

Chciałem zrobić coś podobnego, ale na formularzu z obrazem w tle stwierdziłem, że kiedy tekst na etykiecie zmienił się, przemalowania były oczywiste tą metodą, więc zrobiłem co następuje: * Ustaw etykietę AutoSize na true i TextAlign na MiddleCenter

Następnie za każdym razem, gdy tekst się zmieniał (mój był robiony za pomocą timera), wywołałem następującą metodę:

    private Point GetPosition()
    {
        int y = (this.Height / 2) - (label1.Height / 2);
        int x = (this.Width / 2) - (label1.Width / 2);
        return new Point(x, y);
    }

I ustaw właściwość Location etykiety na tę zwracaną wartość. Zapewniło to, że etykieta zawsze znajdowała się w środku formularza, gdy tekst się zmieniał, a przemalowanie w formie pełnoekranowej nie było oczywiste.

LordPupazz
źródło
1

Możesz wypróbować następujący fragment kodu:

private Point CenterOfMenuPanel<T>(T control, int height=0) where T:Control {
    Point center = new Point( 
        MenuPanel.Size.Width / 2 - control.Width * 2,
        height != 0 ? height : MenuPanel.Size.Height / 2 - control.Height / 2);

    return center;
}

To naprawdę centrum

wprowadź opis obrazu tutaj

Scott Yu
źródło