2010-10-11 19 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