是否有可能在c#中覆盖winform面板的填充?

时间:2013-04-05 13:09:45

标签: c# winforms override padding

我有一个非常简单的问题,但我还没有找到一个简单的灵魂。

我正在创建一个具有边框和圆角的自定义面板。我希望能够覆盖填充,所以无论用户放置什么,我都会添加一些值,因此它不会与border重叠。我希望能够在运行时和在设计时间。因此,例如,如果我将一个控件(如PictureBox)停靠在我的面板中,它将不会绘制边框。

我试图简单地覆盖padding属性,但是我收到以下错误:

cannot override inherited member 'System.Windows.Forms.Control.Padding.set' because it is not marked virtual, abstract, or override
任何人都有(简单)解决方法吗?

2 个答案:

答案 0 :(得分:3)

嗯,Padding属性不是虚拟的,所以尝试覆盖它只是无法工作。您必须替换该属性。这需要使用 new 关键字,这是解决继承问题的一种常常非常麻烦的方法。但它适用于Winforms控件,因为设计器只使用控件的实际实例,Winforms本身并不使用setter和客户端代码,很少使用基类来调用setter。

所以这几乎总能正常工作:

class MyControl : Control {
    public new Padding Padding {
        get { return base.Padding; }
        set {
            // override value
            //...
            base.Padding = value;
        }
    }
}

答案 1 :(得分:0)

我能想出的最好的是:

     protected override void OnPaddingChanged(EventArgs e)
    {
        base.OnPaddingChanged(e);
        if (Padding.Left < 3)
        {
            base.Padding = new Padding(3, base.Padding.Top, base.Padding.Right, base.Padding.Bottom);
        }
        if (Padding.Top < 3)
        {
            base.Padding = new Padding(base.Padding.Left, 3, base.Padding.Right, base.Padding.Bottom);
        }
        if (Padding.Right < 3)
        {
            base.Padding = new Padding(base.Padding.Left, base.Padding.Top, 4, base.Padding.Bottom);
        }
        if (Padding.Bottom < 3)
        {
            base.Padding = new Padding(base.Padding.Left, base.Padding.Top, base.Padding.Right, 3);
        }
    }

它在设计时和运行时都有效,我不知道它是否有用,但它适用于我必须做的事情。