213 votes

Retour à la ligne pour une étiquette dans Windows Forms

Comment pouvons-nous obtenir une fonctionnalité de retour à la ligne pour une étiquette dans Windows Forms ?

J'ai placé une étiquette dans un panneau et ajouté du texte à l'étiquette dynamiquement. Mais il dépasse la longueur du panneau. Comment puis-je resoudre ceci?

392voto

John Gietzen Points 23645

En fait, la réponse acceptée est inutilement compliquée.

Si vous définissez l'étiquette sur AutoSize, celle-ci augmentera automatiquement avec le texte que vous y mettez. (Cela comprend la croissance verticale.)

Si vous voulez en faire un retour à une largeur particulière, vous pouvez définir la propriété MaximumSize.

 myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
 

Testé et fonctionne.

183voto

Jonathan C Dickinson Points 3981

La réponse rapide: commutateur off AutoSize.

Le gros problème ici est que l'étiquette ne change pas automatiquement la hauteur (uniquement la largeur). Pour obtenir ce droit, vous aurez besoin d'une classe de l'étiquette et verticale redimensionner la logique.

Fondamentalement, ce que vous devez faire dans OnPaint est:

  1. La mesure de la hauteur du texte (Graphiques.MeasureString).
  2. Si la hauteur d'étiquette n'est pas égale à la hauteur du texte, définissez la hauteur et de retour.
  3. Dessiner le texte.

Vous aurez également besoin de mettre le ResizeRedraw style de drapeau dans le constructeur.

27voto

alex555 Points 574

Dans mon cas (étiquette sur un panneau), j'ai défini label.AutoSize = false et label.Dock = Fill. Et le texte de l'étiquette est automatiquement encapsulé.

24voto

Sebastian Castaldi Points 2138

Mauvaise nouvelle: il n'est pas un autowrap de la propriété.

Bonne nouvelle: il y a une lumière au bout du tunnel!

Vous pourriez faire cela par programmation à la taille de façon dynamique, mais ici, c'est la solution la plus simple:

  • Sélectionnez les propriétés de l'étiquette
  • AutoSize = True
  • MaximumSize = (Largeur, Hauteur) où Width = max taille vous voulez que le nom et la Hauteur = nombre de pixels que vous voulez qu'il wrap

    Sample Properties

13voto

hypo Points 109

À partir de MSDN , enrouler automatiquement le texte dans l'étiquette :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X