2009-04-20 8 views
4

Je vais tout à fait simplement aller de l'avant avec l'omission de la propriété AutoSize pour les contrôles Label et TextBox dans .NET Compact Framework. J'ai une application simple, qui est censé lister un tas de données de texte (généralement entre un-liners à quelques paragraphes de texte) dans un TabControl. Tout le reste fonctionne bien, mais mes tentatives pour redimensionner dynamiquement les contrôles Label/TextBox que j'utilise pour afficher le texte échouent lamentablement.AutoSize pour Label/TextBox dans .NET Compact Framework

est ici la façon dont je l'ai essayé de le faire:

/* 
Variables: 
s = The text intended for the TextBox 
NewTB = TextBox object 
width = Intended width 
whiteSpaceAdjustment = amount of pixels per line to adjust "wasted" whitespace due to wrapping 
*/ 

String[] linesArray = s.Replace(Environment.NewLine, "\n").Split(new char[] { '\n' }); 

int lines = 0; 

int lineHeight = g.MeasureString(
     s.Replace("\n", "").Replace("\r", ""), 
     LabelFont 
    ).ToSize().Height; 

foreach (String str in linesArray) { 
    if (str.Length == 0) { 
     lines++; 
     continue; 
    } 
    szz = g.MeasureString(str, LabelFont).ToSize(); 
    lines += szz.Width/(width - whiteSpaceAdjustment); 
    lines += (szz.Width % width) != 0 ? 1 : 0; 
} 
NewTB.Height = lines * lineHeight; 
NewTB.Width = width; 

... mais le problème est que la plage nécessaire pour whiteSpaceAdjustment est trop énorme. Quand il est assez grand pour travailler sur les cas les plus extrêmes (les paragraphes sont composés de mots très longs), la plupart des boîtes finissent par être une ligne ou deux trop grandes.

Je vais probablement devoir mettre en place le mot enveloppant moi-même, mais avant que j'y aille, y at-il quelqu'un avec une bonne solution propre prêt pour cela?

Je serais éternellement reconnaissant!

Répondre

3

Essayez cet article

www.mobilepractices.com/2007/12/multi-line-graphicsmeasurestring.html

Assurez-vous que vous regardez aussi le lien au bas de l'article pour pouvoir utiliser différentes polices.

Si vous utilisez .Net CF 3.5, vous pouvez convertir leur exemple en méthode d'extension. Sinon, je vous suggère de créer un nouveau contrôle héritant du contrôle de l'infrastructure.

+0

Pas de soucis, j'ai eu le même problème moi-même. – stevehipwell

+0

Ce lien est mort – thecoolmacdude

1

Voici ce que j'ai développé pour la largeur de redimensionnement automatique de l'étiquette dans WinCE.

/// <summary> 
/// This class provides dynamic size labels, i.e. as the text grows lable width will grow with it. 
/// </summary> 
public partial class AutoSizeLabel : UserControl 
{ 
    private string _strText; 
    private const int padding = 10; 

    public AutoSizeLabel() 
    { 
     InitializeComponent(); 
    } 

    public override string Text 
    { 
     get 
     { 
      return _strText; 
     } 
     set 
     { 
      _strText = value; 
      Refresh(); 
     } 
    } 

    protected override void OnPaint(PaintEventArgs pe) 
    { 
     SizeF size = pe.Graphics.MeasureString(this.Text, this.Font); 
     this.Size = new Size((int)size.Width + padding, this.Height); 

     if (this.Text.Length > 0) 
     { 
      pe.Graphics.DrawString(this.Text, 
       this.Font, 
       new SolidBrush(this.ForeColor), 
       (this.ClientSize.Width - size.Width)/2, 
       (this.ClientSize.Height - size.Height)/2); 
     } 
     // Calling the base class OnPaint 
     base.OnPaint(pe); 
    } 
} 
+0

Cela fonctionne très bien pour la largeur, merci pour le partage. Des indices sur la hauteur de l'auto-dimensionnement? Je dois explicitement le mettre parce que sans lui l'étiquette est 150 heigh au lieu de 20. – Zacho

+0

J'ai découvert la largeur est correcte lors de l'accès de this.Controls [i] .Width juste FYI. – Zacho

+0

@Zacho: Vous voulez une étiquette avec une largeur fixe et une hauteur dynamique? –

Questions connexes