1

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

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

我试图简单地覆盖填充属性,但出现以下错误:

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

4

2 回答 2

3

好吧, Padding 属性不是虚拟的,所以试图覆盖它根本行不通。您将不得不更换该物业。这需要使用new关键字,这是解决继承问题的一种通常非常麻烦的方法。但它适用于 Winforms 控件,因为设计者只使用控件的实际实例,Winforms 本身不使用设置器,客户端代码很少使用基类来调用设置器。

所以这几乎总是可以正常工作:

class MyControl : Control {
    public new Padding Padding {
        get { return base.Padding; }
        set {
            // override value
            //...
            base.Padding = value;
        }
    }
}
于 2013-04-05T13:51:08.097 回答
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);
        }
    }

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

于 2013-04-05T13:44:53.740 回答