web-dev-qa-db-fra.com

Retour à la ligne pour une étiquette dans Windows Forms

Comment obtenir la fonctionnalité d'habillage Word pour une étiquette dans Windows Forms ?

J'ai placé une étiquette dans un panneau et ajouté du texte pour étiqueter dynamiquement. Mais cela dépasse la longueur du panneau. Comment puis-je résoudre ça?

177
Nagu

La réponse rapide: switch off AutoSize .

Le gros problème ici est que l’étiquette ne changera pas automatiquement de hauteur (seulement largeur). Pour réussir, vous devez sous-classer l'étiquette et inclure une logique de redimensionnement vertical.

Ce que vous devez faire dans OnPaint est essentiellement:

  1. Mesurer la hauteur du texte (Graphics.MeasureString).
  2. Si la hauteur de l'étiquette n'est pas égale à la hauteur du texte, définissez la hauteur et le retour.
  3. Dessine le texte.

Vous devrez également définir l’indicateur de style ResizeRedraw dans le constructeur.

151

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

Si vous définissez l'étiquette sur Taille automatique, elle grandira automatiquement avec le texte que vous avez inséré. (Ceci inclut la croissance verticale.)

Si vous souhaitez que Word soit renvoyé à une largeur particulière, vous pouvez définir la propriété MaximumSize.

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

Testé et fonctionne.

341
John Gietzen

Dans mon cas (étiquette sur un panneau), je règle label.AutoSize = false et label.Dock = Fill. Et le texte de l'étiquette est automatiquement emballé.

21
alex555

Mauvaise nouvelle: il n'y a pas de propriété autowrap.

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

Vous pouvez le faire par programme pour le dimensionner de manière dynamique, mais voici la solution la plus simple:

  • Sélectionnez les propriétés de l'étiquette
  • Taille automatique = True
  • MaximumSize = (Largeur, Hauteur) où Largeur = taille maximale de l'étiquette, et Hauteur = comment beaucoup de pixels que vous voulez envelopper

    Sample Properties

16
Sebastian Castaldi

De MSDN , Insérer automatiquement le texte dans une é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();
    }
}
11
hypo

Je devais trouver une solution rapide, alors je viens d'utiliser une zone de texte avec ces propriétés:

var myLabel = new TextBox
                    {
                        Text = "xxx xxx xxx",
                        WordWrap = true,
                        AutoSize = false,
                        Enabled = false,
                        Size = new Size(60, 30),
                        BorderStyle = BorderStyle.None,
                        Multiline =  true,
                        BackColor =  container.BackColor
                    };
6
user3356581

Avoir un meilleur basé sur la réponse de @hypo

public class GrowLabel : Label {
    private bool mGrowing;
    public GrowLabel() {
        this.AutoSize = false;
    }
    private void resizeLabel() {
        if (mGrowing)
            return;
        try {
            mGrowing = true;
            int width = this.Parent == null ? this.Width : this.Parent.Width;

            Size sz = new Size(this.Width, Int32.MaxValue);
            sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
            this.Height = sz.Height + Padding.Bottom + Padding.Top;
        } 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();
    }
}

int width = this.Parent == null ? this.Width : this.Parent.Width; cela vous permet d'utiliser une étiquette à croissance automatique lorsque vous êtes ancré à un parent, par exemple. un panneau.

this.Height = sz.Height + Padding.Bottom + Padding.Top; ici nous nous occupons du rembourrage pour le haut et le bas.

3
march1993

Définissez la propriété AutoEllipsis sur 'TRUE' et la propriété AutoSize sur 'FALSE'.

enter image description here

enter image description here

1
Ravi Kumar G N

Pas sûr que cela convienne à tous les cas d'utilisation, mais j'utilise souvent une astuce simple pour obtenir le comportement d'habillage: mettez votre Label avec AutoSize=false dans un 1x1 TableLayoutPanel qui se chargera de la taille de Label.

1
Pragmateek
  1. Mettez l'étiquette à l'intérieur d'un panneau
  2. Manipulez le ClientSizeChanged event du panneau en faisant en sorte que l’étiquette remplisse l’espace:

    private void Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
        label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
    }
    
  3. Définissez Auto-Size pour l'étiquette sur true

  4. Définissez Dock pour l'étiquette sur Fill
1
noelicus

La réponse simple à ce problème consiste à modifier la propriété DOCK de l’étiquette. C'est "NONE" par défaut.

0
Sunil Neeradi

Si les dimensions du bouton doivent rester inchangées:

myButton.Text = "Word\r\nwrapped"
0
rjain

Si vous voulez vraiment définir la largeur de l'étiquette indépendamment du contenu, je trouve que le moyen le plus simple est le suivant:

  • Définir autosize true
  • Définissez la largeur maximale à votre guise
  • Définir la largeur minimale à l'identique

L'étiquette a maintenant une largeur constante, mais elle adapte automatiquement sa hauteur.

Ensuite, pour le texte dynamique, réduisez la taille de la police. Si nécessaire, utilisez cet extrait de code dans le sous-dossier où le texte de l'étiquette est défini:

If Me.Size.Height - (Label12.Location.Y + Label12.Height) < 20 Then
    Dim naam As String = Label12.Font.Name
    Dim size As Single = Label12.Font.SizeInPoints - 1
    Label12.Font = New Font(naam, size)
End If
0
Kjell Verbeke

Cela m'a aidé dans mon formulaire appelé InpitWindow: In Designer pour Label:

AutoSize = true;
Achors = Top, Left, Right.

private void InputWindow_Shown(object sender, EventArgs e) {
    lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left - btOK.Margin.Right -
        lbCaption.Margin.Right - lbCaption.Margin.Left, 
        Screen.GetWorkingArea(this).Height / 2);
    this.Height = this.Height + (lbCaption.Height - btOK.Height - btCancel.Height);
    //Uncomment this line to prevent form height chage to values lower than initial height
    //this.MinimumSize = new Size(this.MinimumSize.Width, this.Height);
}
//Use this handler if you want your label change it size according to form clientsize.
private void InputWindow_ClientSizeChanged(object sender, EventArgs e) {
    lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left * 2 - btOK.Margin.Right * 2 -
        lbCaption.Margin.Right * 2 - lbCaption.Margin.Left * 2,
        Screen.GetWorkingArea(this).Height / 2);
}

Code entier de ma forme

0
Mic

Si votre panneau limite la largeur de votre étiquette, vous pouvez définir la propriété Anchor de celle-ci sur Left, Right et définir AutoSize sur true. Ceci est conceptuellement similaire à une écoute de l’événement SizeChanged du Panel et à la mise à jour du MaximumSize de l’étiquette en un new Size(((Control)sender).Size.Width, 0) comme suggéré par ne réponse précédente . Chaque côté répertorié dans la propriété Anchor est, ainsi, ancré au côté interne respectif du contrôle. Donc, lister deux côtés opposés dans Anchor définit efficacement la dimension du contrôle. Anchoring to Left and Right définit la propriété Width du contrôle et Anchoring to Top and Bottom définit sa propriété Height.

Cette solution, en C #:

label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
0
binki