我有一个非常简单的问题,但我还没有找到一个简单的灵魂。
我正在创建一个具有边框和圆角的自定义面板。我希望能够覆盖填充,所以无论用户放置什么,我都会添加一些值,因此它不会与border重叠。我希望能够在运行时和在设计时间。因此,例如,如果我将一个控件(如PictureBox)停靠在我的面板中,它将不会绘制边框。
我试图简单地覆盖padding属性,但是我收到以下错误:
cannot override inherited member 'System.Windows.Forms.Control.Padding.set' because it is not marked virtual, abstract, or override
任何人都有(简单)解决方法吗?
答案 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);
}
}
它在设计时和运行时都有效,我不知道它是否有用,但它适用于我必须做的事情。