2009-02-06 70 views
3

我有一個從UserControl下降的用戶控件。VisualStudio:如何在設計時將虛線邊框添加到UserControl?

當放到表單上時,用戶控件是不可見的,因爲它沒有任何類型的邊框來顯示它自己。

在設計時,PictureBox和Panel控件繪製一個虛線的1px邊框以使其可見。

這樣做的正確方法是什麼?是否有一個屬性可以用來使VS添加?

回答

3

沒有財產會自動做到這一點。但是,您可以通過覆蓋控件中的OnPaint並手動繪製矩形來對其進行歸檔。

在重寫的事件中,您可以調用base.OnPaint(e)繪製控件內容,然後添加使用圖形對象在邊線周圍繪製虛線。

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

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

正如你看到的,你需要在查詢控件DesignMode屬性,因此只有在您的IDE繪製if語句來包裝這個額外的代碼。

0

Panel這樣做的方式(這表明這是這樣做的實際正確方法)是DesignerAttribute。此屬性可用於設計時間添加到Control組件以及非控制組件(如Timer)。

使用DesignerAttribute時,您需要指定從IDesigner派生的類。對於具體的Control設計師,您應該從ControlDesigner中派生出來。

在您的ControlDesigner的特定實施中,您希望覆蓋OnPaintAdornment。這種方法的目的是專門在控件之上繪製設計器提示,例如邊框。

以下是Panel使用的實現。您可以複製該文件並將其用於您的控制,但您顯然需要調整專門指向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是,你可能會或可能不希望爲您的特定設計的實施基地,使用一個公共類。