Wie halte ich ein Label in WinForms zentriert?

137

In WinFormsIch verwende a Label, um verschiedene Meldungen wie Erfolg, Misserfolg usw. anzuzeigen.

Ich möchte dieses Etikett in der Mittelform zentrieren. Ich möchte eine Lösung, die es zentriert, ob das Etikett nur ein Wort oder einen ganzen Satz enthält.

haansi
quelle

Antworten:

281

Setzen Sie Labeldie AutoSizeEigenschaft auf False, TextAlignEigenschaft auf MiddleCenterund DockEigenschaft auf Fill.

Decyklon
quelle
danke decyclone, es hat funktioniert. Kannst du dir zeigen, was Dock macht?
Haansi
3
Mit der Control.DockEigenschaft ( msdn.microsoft.com/en-us/library/… ) können Sie ein Steuerelement an eine bestimmte Seite des Containers andocken (kleben). Zum Beispiel Left, Top, Rightoder Bottom. FillWeist das Steuerelement an, den gesamten verfügbaren Speicherplatz im Container zu belegen.
Decyclone
1
Wenn Sie nicht möchten, dass das Etikett den gesamten verfügbaren Speicherplatz ausfüllt, möchten Sie möglicherweise die Dock-Eigenschaft auf "Keine" setzen, wie von user3866622 in seiner programmatischen Lösung vorgeschlagen.
Tim
3
Hat funktioniert, aber ich musste nichts an der DockEinstellung ändern.
Jim Fell
4
DockEinstellung war unnötig. Durch Ändern der AutoSizeEigenschaft erhält die Beschriftung einen Begrenzungsrahmen, dessen Größe Sie manuell anpassen können.
Nick Roberts
13

Einige kleinere zusätzliche Inhalte zum programmgesteuerten Einstellen:

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

Die Ausrichtung von Dockstil und Inhalt kann von Ihren Anforderungen abweichen. Zum Beispiel verwende ich für eine einfache Beschriftung in einem wpf-Formular DockStyle.None.

user3866622
quelle
12

Sie erreichen es mit der Einstellungseigenschaft Anchor: None.

Sebastian Xawery Wiśniowiecki
quelle
10

Wenn Sie die Beschriftung nicht im gesamten verfügbaren Bereich andocken möchten, legen Sie einfach das SizeChanged-Ereignis anstelle von TextChanged fest. Durch Ändern jedes Buchstabens werden die width-Eigenschaft des Etiketts sowie sein Text geändert, wenn die automatische Größeneigenschaft auf True gesetzt wird. Übrigens können Sie jede Formel verwenden, um die Beschriftung in der Form zentriert zu halten.

private void lblReport_SizeChanged(object sender, EventArgs e)
{
    lblReport.Left = (this.ClientSize.Width - lblReport.Size.Width) / 2;
}
Umut OVECOGLU
quelle
2

Die akzeptierte Antwort hat bei mir aus zwei Gründen nicht funktioniert:

  1. Ich hatte BackColorso eingestellt AutoSize = falseundDock = Fill bewirkt, dass die Hintergrundfarbe das gesamte Formular ausfüllt
  2. Ich hätte AutoSizesowieso nicht auf false setzen können, da mein Beschriftungstext dynamisch war

Stattdessen habe ich einfach die Breite des Formulars und die Breite des Etiketts verwendet, um den linken Versatz zu berechnen:

MyLabel.Left = (this.Width - MyLabel.Width) / 2;
TheIronCheek
quelle
1

Ich wollte etwas Ähnliches tun, aber in einem Formular mit einem Hintergrundbild stellte ich fest, dass beim Ändern des Textes in der Beschriftung die Neulackierungen bei dieser Methode offensichtlich waren. Daher habe ich Folgendes getan: * Setzen Sie die Beschriftung AutoSize auf true und TextAlign auf MiddleCenter

Jedes Mal, wenn sich der Text änderte (meiner wurde mit einem Timer erstellt), rief ich die folgende Methode auf:

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

Setzen Sie die Location-Eigenschaft des Labels auf diesen Rückgabewert. Dies stellte sicher, dass sich die Beschriftung immer in der Mitte des Formulars befand, wenn sich der Text änderte und die Neulackierungen für ein Vollbildformular nicht offensichtlich waren.

LordPupazz
quelle
1

Sie können das folgende Code-Snippet ausprobieren:

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;
}

Es ist wirklich Zentrum

Geben Sie hier die Bildbeschreibung ein

Scott Yu
quelle