Question

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 pour étiqueter dynamiquement. Mais cela dépasse la longueur du panneau. Comment puis-je résoudre ce problème?

Était-ce utile?

La solution

La réponse rapide: désactiver désactiver Taille automatique .

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 la logique de redimensionnement vertical.

Ce que vous devez faire dans OnPaint est le suivant:

  1. Mesurez 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. Dessinez le texte.

Vous devez également définir ResizeRedraw dans le constructeur.

Autres conseils

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 y avez inséré. (Ceci inclut la croissance verticale.)

Si vous souhaitez que les mots soient renvoyés à une largeur particulière, vous pouvez définir la propriété MaximumSize.

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

Testé et fonctionne.

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

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
  • AutoSize = True
  • MaximumSize = ( Largeur , Hauteur ) où Largeur = taille maximale que vous souhaitez attribuer à l'étiquette et Hauteur = combien de pixels vous souhaitez envelopper

    Propriétés de l'exemple

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

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

Ayez une meilleure réponse en fonction de 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 un label à croissance automatique lorsqu'il est ancré à un parent, par exemple. un panneau.

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

  1. Placez l'étiquette dans un panneau
  2. Gérez l'événement ClientSizeChanged du panneau, en faisant en sorte que étiquette remplir 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 Remplir

Je ne suis pas sûr que cela conviendra à tous les cas d'utilisation, mais j'utilise souvent une astuce simple pour obtenir le comportement d'emballage: placez votre Label avec AutoSize = false dans un TableLayoutPanel 1x1 qui prendra en charge la taille de Label .

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

 entrer la description de l'image ici

 entrer la description de l'image ici

Si votre panneau limite la largeur de votre étiquette, vous pouvez définir la propriété Anchor de celle-ci sur Gauche, Droite et définir AutoSize sur true. Cela ressemble conceptuellement à écouter l'événement SizeChanged du Panel et à mettre à jour MaximumSize de l'étiquette en un nouvel Size (expéditeur ((Control)) .Size.Width, 0) comme suggéré. par une 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. Ainsi, énumérer 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;

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éfinissez autosize sur
  • Définissez la largeur maximale à votre guise
  • Définir la largeur minimale à l'identique

Maintenant, l’étiquette a une largeur constante, mais elle adapte automatiquement sa hauteur.

Ensuite, pour le texte dynamique, diminuez 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

Cela m'a aidé dans mon formulaire appelé InpitWindow: Dans 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 complet de mon formulaire

Si les dimensions du bouton doivent rester inchangées:

myButton.Text = "word\r\nwrapped"

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

Utilisez style = "overflow: faites défiler" dans l'étiquette comme dans le code HTML ci-dessous. Cela ajoutera la barre de défilement dans l’étiquette du panneau.

<asp:Label
    ID="txtAOI"
    runat="server"
    style="overflow:Scroll"
    CssClass="areatext"
    BackColor="White"
    BorderColor="Gray"
    BorderWidth="1"
    Width = "900" ></asp:Label>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top