web-dev-qa-db-fra.com

Comment redimensionner automatiquement la hauteur d'une étiquette mais pas la largeur

J'ai une Panel que je crée par programme; De plus, j'y ajoute plusieurs composants.

L'un de ces composants est une Label qui contiendra le contenu généré par l'utilisateur.

Je ne sais pas quelle doit être la hauteur de l'étiquette, mais sa largeur est fixe.

Comment puis-je définir la hauteur pour qu'il affiche tout le texte, sans changer la largeur?

30
Malfist

Utilisez simplement la propriété AutoSize, redéfinissez-la sur True.

Définissez la propriété MaximumSize sur, par exemple, (60, 0) afin qu’elle ne puisse pas croître horizontalement, mais uniquement verticalement.

68
Hans Passant

Utilisez Graphics.MeasureString :

public SizeF MeasureString(
    string text,
    Font font,
    int width
)

Le paramètre width spécifie le valeur maximale de la composante de largeur de la structure SizeF retournée (Largeur). Si le paramètre width est inférieure à la largeur réelle du string, le composant Width retourné est tronqué à une valeur représentant le nombre maximum de caractères que s'adaptera à la largeur spécifiée . Pour accueillir la chaîne entière, le fichier le composant Hauteur retourné est ajusté à une valeur qui permet d'afficher le chaîne avec caractère wrap.

En d'autres termes, cette fonction peut calculer la hauteur de votre chaîne en fonction de sa largeur.

5
Brian

Si vous avez une étiquette et que vous souhaitez contrôler l'ajustement vertical, vous pouvez procéder comme suit:

MyLabel.MaximumSize = new Size(MyLabel.Width, 0)
MyLabel.Height = MyLabel.PreferredHeight
MyLabel.MaximumSize = new Size(0, 0)

Ceci est utile par exemple si vous avez une étiquette dans un conteneur qui peut être redimensionnée. Dans ce cas, vous pouvez définir la propriété Anchor pour que l'étiquette soit redimensionnée horizontalement mais pas verticalement. Dans l'événement de redimensionnement, vous pouvez ajuster la hauteur à l'aide de la méthode ci-dessus.

Pour éviter que l'ajustement vertical ne soit interprété comme un nouvel événement de redimensionnement, vous pouvez utiliser un booléen:

bool _inVerticalFit = false;

Et dans l'événement de redimensionnement:

if (_inVerticalFit) return;
_inVerticalFit = true;
MyLabel.MaximumSize = new Size(MyLabel.Width, 0)
MyLabel.Height = MyLabel.PreferredHeight
MyLabel.MaximumSize = new Size(0, 0)
_inVerticalFit = false;
0
circular