2010-10-11 528 views
2

我想重寫System.Windows.Forms.UserControl來繪製自定義邊框(例如使用自定義顏色)。使用內置類是不可能的,因爲可以影響邊界行爲的唯一方法/屬性是BorderStyle。如何重寫UserControl類來繪製自定義邊框?

重寫OnPaint以下方法(下面的代碼)不是一個好的解決方案,因爲它基本上是在原始頂部繪製另一個邊框。

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

     if (this.BorderStyle == BorderStyle.FixedSingle) 
      ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.LightGray, ButtonBorderStyle.Solid); 
    } 

有誰知道如何覆蓋自定義控件中的邊框繪圖?

由於某些原因,將此用戶控件放到面板中並不適用於我的情況。

回答

5

將base.BorderStyle設置爲None,以便不繪製默認邊框。您需要重寫BorderStyle屬性才能完成此工作。

public UserControl1() { 
     InitializeComponent(); 
     base.BorderStyle = BorderStyle.None; 
     this.BorderStyle = BorderStyle.FixedSingle; 
    } 

    private BorderStyle border; 

    public new BorderStyle BorderStyle { 
     get { return border; } 
     set { 
      border = value; 
      Invalidate(); 
     } 
    } 
+0

謝謝你,我想出了類似的解決方案。但是不使用BorderStyle類型作爲屬性,而只使用布爾值(不管是否繪製)。 但是,這並不能解決原始問題:如何不重繪邊框,而是覆蓋內置功能來繪製我需要的邊框。 – 2010-10-11 18:11:27

+0

但要小心。如果您的控件被分配給UserControl變量並且邊框屬性發生更改,這可能會導致潛在的意外行爲。即:'UserControl x = new MyControl(); x.BorderStyle = BorderStyle.Fixed3D;'這會設置'base.Borderstyle',而不是你的'new' BorderStyle屬性。 – ricovox 2013-11-27 05:00:17