44 votes

Déterminer la taille de l'étiquette en fonction de la quantité de texte et de la taille de la police dans Winforms / C #

Je voudrais savoir si il y a une meilleure approche de ce problème. Je veux redimensionner une étiquette (à la verticale) pour accueillir certaine quantité de texte. Mon label a une largeur fixe (environ 60 caractères de large avant il doit envelopper), à environ 495 pixels. La police est également une taille fixe (12points autant que je sache), mais le texte ne l'est pas.

Ce que je veux faire, c'est augmenter la Hauteur d'Étiquette quand il y a un "Saut de ligne" ou le texte doit envelopper; l'idée est que le texte est entièrement visible sur l'étiquette. Le redimensionnement automatique ne fonctionne pas car il va se développer en largeur, pas à la hauteur.

Bien sûr, je pourrais compter le nombre de retours à la ligne et d'ajouter: retours à la ligne * LineHeight, et puis étant donné que j'ai réussi à mettre de 60 caractères par ligne, suffit de diviser le nombre de caractères et d'ajouter que de nombreux LineHeight pixels en tant que de besoin.

Je me demandais si il y avait une manière plus professionnelle de le faire. Mon approche trop "boiteux" ?

Merci à l'avance.

97voto

Marc Gravell Points 482669

Que diriez-vous de Graphics.MeasureString , avec la surcharge qui accepte une chaîne, la police et la largeur maximale? Cela renvoie un SizeF , de sorte que vous pouvez arrondir les Height .

         using(Graphics g = CreateGraphics()) {
            SizeF size = g.MeasureString(text, lbl.Font, 495);
            lbl.Height = (int) Math.Ceiling(size.Height);
            lbl.Text = text;
        }
 

33voto

MusiGenesis Points 49273

Système.De dessin.Graphique a un MeasureString méthode que vous pouvez utiliser à cette fin. Utiliser la surcharge qui prend une chaîne de caractères, une police et un int "largeur" paramètre; ce dernier paramètre spécifie la largeur maximale autorisée pour la chaîne - utiliser l'ensemble de la largeur de votre étiquette pour ce paramètre.

MeasureString renvoie une SizeF objet. Utiliser la Hauteur de la propriété de cet objet renvoyé à la hauteur de votre étiquette.

Remarque: pour obtenir un objet Graphique pour ce faire, vous pouvez appeler cette.CreateGraphics.

9voto

Quibblesome Points 14441

Graphics.MeasureString () va probablement vous aider.

C’est également l’un des seuls cas d’utilisation de l’appel Control.CreateGraphics ()!

1voto

blak3r Points 5096

J'ai posté un contrôle utilisateur qui permet de résoudre ce problème dans l'acceptation de réponse ici: Autoscale Police dans un Contrôle de zone de texte de sorte que son plus grand possible et s'inscrit toujours dans la zone de texte limites

Le contrôle s'étend RichTextBox. Il a une méthode: ScaleFontToFit qui va automatiquement redimensionner la police pour mettre tout le texte en forme.

Chose intéressante est qu'il respecte la propriété multiline. Si c'est vrai il permet des mots à envelopper, Sinon ça ne marche pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X