【问题标题】:Is it possible to override a winform panel's padding in c#?是否可以在 c# 中覆盖 winform 面板的填充?
【发布时间】:2013-03-27 22:07:00
【问题描述】:

我有一个非常简单的问题,但我还没有找到一个简单的解决方案。

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

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

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

【问题讨论】:

  • 是否需要覆盖?你试过base.Padding = x吗?
  • 您在设计时或运行时需要这个,还是两者兼而有之?
  • @David 这在运行时有效,但在设计时无效
  • @JohnWillemse,如果可能的话。我将编辑我的问题。
  • 对于运行时,您可以覆盖 OnPaddingChanged,但这在设计时不起作用。

标签: c# winforms overriding padding


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢汉斯!我最终使用了您的答案,它的工作原理与我提出的完全一样(据我所知)。把你的作为接受的答案。
【解决方案2】:

我能想到的最好的是:

     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);
        }
    }

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

【讨论】:

    猜你喜欢
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多