1

私は非常に単純な問題を抱えていますが、単純な魂をまだ見つけていません。

境界線と角の丸いカスタム パネルを作成しています。パディングをオーバーライドできるようにしたいので、ユーザーが何を入れても、ボーダーと重ならないように値を追加します。これを実行時と設計時。たとえば、PictureBox などのコントロールをパネル内にドッキングすると、境界線を越えて描画されません。

padding プロパティを単純にオーバーライドしようとしましたが、次のエラーが発生します。

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 に答える