2010-12-14 5 views
0

J'essaie d'étendre la classe System.Windows.Forms.Label pour prendre en charge le texte verticalement dessiné. Je fais cela en créant une nouvelle propriété appelée MyLabelOrientation que l'utilisateur peut définir Horizontal ou Vertical. Lorsque l'utilisateur modifie ce paramètre, les valeurs de largeur et de hauteur sont permutées pour redimensionner le contrôle selon sa nouvelle orientation. Enfin, je remplace la fonction OnPaint pour dessiner mon Label.Remplacer AutoSize pour le contrôle d'étiquette dérivé en C#

Je souhaite également étendre la propriété AutoSize pour ce contrôle afin que mon Label soit automatiquement dimensionné en fonction du texte qu'il contient. Pour l'orientation horizontale, la fonctionnalité de base l'implémente pour moi. Pour l'orientation verticale, je crée un objet Graphics et règle la hauteur du contrôle sur la largeur de l'objet SizeF retourné par Graphics.MeasureString (Text, Font). Vous pouvez voir un exemple du code que j'utilise ci-dessous.

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.ComponentModel.Design; 
using System.Windows.Forms.Design; 

public class MyLabel : Label 
{ 
    public enum MyLabelOrientation {Horizontal, Vertical}; 
    protected MyLabelOrientation m_orientation = MyLabelOrientation.Horizontal; 

    [Category("Appearance")] 
    public virtual MyLabelOrientation Orientation 
    { 
     get { return m_orientation; } 
     set 
     { 
      m_orientation = value; 
      int temp = Height; 
      Width = Height; 
      Height = temp; 
      Refresh(); 
     } 
    } 

    private Size ResizeLabel() 
    { 
     Graphics g = Graphics.FromHwnd(this.Handle); 
     SizeF newSize = g.MeasureString(Text, Font); 
     if (m_orientation == MyLabelOrientation.Horizontal) 
      Width = (int)newSize.Width; 
     else 
      Height = (int)newSize.Width; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     Brush textBrush = new SolidBrush(this.ForeColor); 

     if (m_orientation == LabelOrientation.Vertical) 
     { 
      e.Graphics.TranslateTransform(Width, 0); 
      e.Graphics.RotateTransform(90); 
      e.Graphics.DrawString(Text, Font, textBrush, Padding.Left, Padding.Top); 
     } 
     else 
     { 
      base.OnPaint(e); 
     } 
    } 
} 

Cependant, la mise en AutoSize à true semble prévenir et/ou remplacer toute modification de la taille du contrôle. Cela signifie que je ne peux pas changer la largeur ou la hauteur lorsque je veux changer l'orientation du label. Je me demande si ce comportement peut être remplacé, afin que je puisse tester si AutoSize est défini, puis ajuster la taille du contrôle en fonction de son orientation.

Répondre

1

Je ne l'ai pas fait cela avant, je crois que vous pouvez théoriquement remplacer une déclaration de propriété (via le mot-clé new) et vérifier l'orientation avant de poursuivre:

override public bool AutoSize 
{ 
    set 
    { 
     if(/* orientation is horizontal */) 
     { 
      base.AutoSize = value; 
     } 
     else 
     { 
      // do what you need to do 
     }  
    }  
} 
+0

AutoSize est une propriété virtuelle. Utilisez override, pas nouveau. –

+0

@Hans: mis à jour en conséquence; Je n'ai pas vérifié si c'était virtuel avant de poster. J'ai supposé que ce n'était pas basé sur la nature de la question. Je vous remercie. –

+0

J'ai déjà essayé cette solution, et le contrôle ignore plus ou moins lorsque vous redéfinissez AutoSize comme ceci. AutoSize empêche toute modification de la largeur ou de la hauteur, malgré la source. J'ai besoin de remplacer quelque chose d'autre qui regarde probablement le paramètre AutoSize et redimensionne en conséquence. – walkingTarget

0

Si pense qu'une solution est de passer outre se OnResize:

protected override void OnResize(EventArgs e) 
{ 
    if (AutoSize) 
    { 
     // Perform your own resizing logic 
    } 
    else 
     OnResize(e); 
} 
Questions connexes