Réponses:
La réponse rapide: désactivez AutoSize .
Le gros problème ici est que l'étiquette ne changera pas sa hauteur automatiquement (seulement la largeur). Pour ce faire, vous devrez sous-classer l'étiquette et inclure une logique de redimensionnement vertical.
En gros, ce que vous devez faire dans OnPaint est:
Vous devrez également définir l' indicateur de style ResizeRedraw dans le constructeur.
En fait, la réponse acceptée est inutilement compliquée.
Si vous définissez l'étiquette sur AutoSize, elle s'agrandira automatiquement avec le texte que vous y mettez. (Cela inclut la croissance verticale.)
Si vous souhaitez que le mot 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.
Dock
propriété de l'étiquette et du panneau sur Top
, au lieu de ma solution.
OnResize
parent et j'ai appelémyLabel.MaximumSize = new Size(Bounds.Width, 0);
Dans mon cas (étiquette sur un panneau) j'ai mis label.AutoSize = false
etlabel.Dock = Fill
. Et le texte de l'étiquette est automatiquement enveloppé.
Il n'y a pas de propriété autowrap, mais cela peut être fait par programme pour le dimensionner dynamiquement. Voici une solution:
Sélectionnez les propriétés de l'étiquette
AutoSize
= True
MaximumSize
= ( Largeur , Hauteur ) où Largeur = taille maximale que vous voulez que l'étiquette soit et Hauteur = combien de pixels vous voulez qu'elle enveloppe
À partir de MSDN , enveloppez 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();
}
}
Height = sz.Height + Padding.Vertical;
)
Je devais trouver une solution rapide, alors j'ai juste utilisé un TextBox 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 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 l'étiquette de croissance automatique lorsqu'elle est ancrée à 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.
Manipulez le ClientSizeChanged event
pour le panneau, en faisant 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);
}
Définir Auto-Size
pour l'étiquette surtrue
Dock
pour l'étiquette surFill
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: mettez votre Label
avec à l' AutoSize=false
intérieur d'un 1x1 TableLayoutPanel
qui prendra soin de la Label
taille du.
Si votre panneau limite la largeur de votre étiquette, vous pouvez définir la propriété Anchor de votre étiquette sur Left, Right et définir AutoSize sur true. Ceci est conceptuellement similaire à l'écoute de l' SizeChanged
événement du Panel et à la mise à jour de MaximumSize de l'étiquette en a new Size(((Control)sender).Size.Width, 0)
comme suggéré par une réponse précédente . Chaque côté répertorié dans la propriété Anchor est, bien, ancré au côté interne respectif du contrôle conteneur. Ainsi, la liste de deux côtés opposés dans Anchor définit effectivement la dimension du contrôle. L'ancrage à gauche et à droite définit la propriété Width du contrôle et l'ancrage en haut et en bas définit sa propriété Height.
Cette solution, comme 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:
Maintenant, l'étiquette est de largeur constante, mais elle adapte sa hauteur automatiquement.
Ensuite, pour le texte dynamique, diminuez la taille de la police. Si nécessaire, utilisez cet extrait de code dans le sous 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: In Designer for 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);
}
La réponse simple à ce problème consiste à modifier la propriété DOCK de l'étiquette. Il est "AUCUN" par défaut.
Si vous saisissez au préalable du texte dans l'étiquette, vous pouvez le faire.
Utilisez style="overflow:Scroll"
dans l'étiquette comme dans le HTML ci-dessous. Cela ajoutera la barre de défilement dans l'étiquette dans le panneau.
<asp:Label
ID="txtAOI"
runat="server"
style="overflow:Scroll"
CssClass="areatext"
BackColor="White"
BorderColor="Gray"
BorderWidth="1"
Width = "900" ></asp:Label>