2009-02-06 13 views
3

J'ai un contrôle utilisateur qui descend de UserControl.VisualStudio: Comment ajouter la bordure en pointillés à un contrôle UserControl au moment du design?

Lorsqu'il est déposé sur le formulaire, le contrôle utilisateur est invisible, car il n'a aucun type de bordure à afficher. Les contrôles PictureBox et Panel, au moment de la conception, dessinent une bordure 1px en pointillés pour la rendre visible.

Quelle est la bonne façon de faire cela? Y at-il un attribut que vous pouvez utiliser pour que VS l'ajoute?

Répondre

3

Aucune propriété ne le fera automatiquement. Cependant, vous pouvez l'archiver en remplaçant OnPaint dans votre contrôle et en dessinant manuellement le rectangle.

A l'intérieur de l'événement surchargé, vous pouvez appeler base.OnPaint (e) pour dessiner le contenu des contrôles, puis ajouter l'objet graphique pour peindre la ligne pointillée autour du bord.

protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     if (this.DesignMode) 
      ControlPaint.DrawBorder(e.Graphics,this.ClientRectangle,Color.Gray,ButtonBorderStyle.Dashed); 
    } 

Comme vous pouvez le voir, vous devrez envelopper ce code supplémentaire dans une instruction if qui interroge les contrôles DesignMode propriété de sorte qu'il ne tire que dans votre IDE.

0

La façon dont Panel le fait (ce qui suggère que c'est la bonne façon de le faire) est avec le DesignerAttribute. Cet attribut peut être utilisé pour les ajouts de temps de conception à Control -composants ainsi que des composants non-contrôle (comme Timer). Lorsque vous utilisez le DesignerAttribute, vous devez spécifier une classe dérivée de IDesigner lorsque vous utilisez DesignerAttribute. Pour un concepteur Control spécifiquement, vous devriez dériver de ControlDesigner. Dans votre implémentation particulière de ControlDesigner, vous souhaitez remplacer le OnPaintAdornment. Le but de cette méthode est de dessiner spécifiquement des astuces de concepteur sur le dessus du contrôle, comme une bordure par exemple.

Voici l'implémentation utilisée par Panel. Vous pouvez copier cela et l'utiliser pour votre contrôle, mais vous devez évidemment ajuster les parties qui se réfèrent spécifiquement à la classe Panel.

internal class PanelDesigner : ScrollableControlDesigner 
{ 
    protected Pen BorderPen 
    { 
     get 
     { 
      Color color = ((double)this.Control.BackColor.GetBrightness() < 0.5) ? ControlPaint.Light(this.Control.BackColor) : ControlPaint.Dark(this.Control.BackColor); 
      return new Pen(color) 
      { 
       DashStyle = DashStyle.Dash 
      }; 
     } 
    } 
    public PanelDesigner() 
    { 
     base.AutoResizeHandles = true; 
    } 
    protected virtual void DrawBorder(Graphics graphics) 
    { 
     Panel panel = (Panel)base.Component; 
     if (panel == null || !panel.Visible) 
     { 
      return; 
     } 
     Pen borderPen = this.BorderPen; 
     Rectangle clientRectangle = this.Control.ClientRectangle; 
     int num = clientRectangle.Width; 
     clientRectangle.Width = num - 1; 
     num = clientRectangle.Height; 
     clientRectangle.Height = num - 1; 
     graphics.DrawRectangle(borderPen, clientRectangle); 
     borderPen.Dispose(); 
    } 
    protected override void OnPaintAdornments(PaintEventArgs pe) 
    { 
     Panel panel = (Panel)base.Component; 
     if (panel.BorderStyle == BorderStyle.None) 
     { 
      this.DrawBorder(pe.Graphics); 
     } 
     base.OnPaintAdornments(pe); 
    } 
} 

ScrollableControlDesigner est une classe publique que vous pouvez ou ne voulez pas utiliser comme base pour votre mise en œuvre de design particulier.

Questions connexes