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?
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:
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 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.
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é.
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:
MaximumSize = (Largeur, Hauteur) où Largeur = taille maximale de l'étiquette, et Hauteur = comment beaucoup de pixels que vous voulez envelopper
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
};
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.
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
.
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);
}
Définissez Auto-Size
pour l'étiquette sur true
Dock
pour l'étiquette sur Fill
La réponse simple à ce problème consiste à modifier la propriété DOCK de l’étiquette. C'est "NONE" par défaut.
Si les dimensions du bouton doivent rester inchangées:
myButton.Text = "Word\r\nwrapped"
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:
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
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);
}
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;