Comment conserver une étiquette centrée dans WinForms?

137

Dans WinFormsJ'utilise un Labelpour afficher différents messages tels que succès, échec, etc.

Je voudrais centrer cette étiquette dans la forme centrale. Je veux une solution qui la maintiendra centrée, qu'il n'y ait qu'un seul mot ou une phrase entière dans l'étiquette.

haansi
la source

Réponses:

281

Définissez Labella AutoSizepropriété de sur False, la TextAlignpropriété sur MiddleCenteret la Dockpropriété sur Fill.

décyclone
la source
merci décyclone, cela a fonctionné. pouvez-vous guider ce que fait Dock?
haansi
3
Avec la Control.Dockpropriété ( msdn.microsoft.com/en-us/library/… ), vous pouvez ancrer (coller) un contrôle à un certain côté du conteneur. Par exemple Left, Top, Rightou Bottom. Fillindique au contrôle de prendre tout l'espace disponible dans le conteneur.
décyclone
1
À moins que vous ne souhaitiez que l'étiquette remplisse tout l'espace disponible, vous souhaiterez peut-être définir la propriété Dock sur «Aucun», comme suggéré par user3866622 dans sa solution de programmation.
Tim
3
A fonctionné, mais je n'avais rien besoin de faire pour le Dockdécor.
Jim Fell
4
Dockle réglage était inutile. La modification de la AutoSizepropriété donne à l'étiquette un cadre de délimitation dont vous pouvez ajuster manuellement la taille.
Nick Roberts
13

Quelques contenus supplémentaires mineurs à définir par programmation:

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

Le style d'ancrage et l'alignement du contenu peuvent différer de vos besoins. Par exemple, pour une étiquette simple sur un formulaire wpf, j'utilise DockStyle.None.

user3866622
la source
12

Vous l'obtiendrez avec la propriété Anchor: None.

Sebastian Xawery Wiśniowiecki
la source
10

Si vous ne souhaitez pas ancrer l'étiquette dans toute la zone disponible, définissez simplement l'événement SizeChanged au lieu de TextChanged. La modification de chaque lettre modifie la propriété width de l'étiquette ainsi que son texte lorsque la propriété de taille automatique est définie sur True. Donc, en passant, vous pouvez utiliser n'importe quelle formule pour garder l'étiquette centrée dans le formulaire.

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

La réponse acceptée n'a pas fonctionné pour moi pour deux raisons:

  1. J'avais BackColordéfini ce paramètre AutoSize = falseet Dock = Fillfait que la couleur d'arrière-plan remplisse tout le formulaire
  2. De toute façon, je n'aurais pas pu AutoSizedéfinir la valeur false car le texte de mon étiquette était dynamique

Au lieu de cela, j'ai simplement utilisé la largeur du formulaire et la largeur de l'étiquette pour calculer le décalage gauche:

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

Je voulais faire quelque chose de similaire, mais sur un formulaire avec une image d'arrière-plan, j'ai trouvé que lorsque le texte de l'étiquette changeait, les repeints étaient évidents avec cette méthode, j'ai donc fait ce qui suit: * Définissez l'étiquette AutoSize sur true et TextAlign sur MiddleCenter

Ensuite, chaque fois que le texte a changé (le mien a été fait à l'aide d'une minuterie), j'ai appelé la méthode suivante:

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

Et définissez la propriété Location de l'étiquette sur cette valeur de retour. Cela garantissait que l'étiquette était toujours au centre du formulaire lorsque le texte changeait et que les repeints pour un formulaire en plein écran n'étaient pas évidents.

LordPupazz
la source
1

Vous pouvez essayer l'extrait de code suivant:

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

C'est vraiment le centre

entrez la description de l'image ici

Scott Yu
la source