使System.Windows.Forms.Control的大小取决于父级的大小

时间:2014-03-16 18:09:44

标签: c# winforms visual-studio

我想让一些控件(特别是:Button,Label和Panel)依赖于父级的大小。因此,按钮可能是父母宽度的0.1倍,高度的0.05倍,并且位于宽度的0.3倍和高度的0.2倍。 现在我有两个问题:

首先,我想将Control类的行为更改为一种“相对大小和相对位置” - Control。如果Control类有一个我可以覆盖的'onParentResized'方法,这将非常容易,但它没有。所以现在我的解决方案就是这个

class RelativeControl : Control
{
    Control previousParent;
    double relativeWidth, relativeHeight, relativeX, relativeY;    

    public RelativeControl(double RelativeWidth, double RelativeHeight, double RelativeX, double RelativeY)
    {
        // the arguments need to be between 0 and 1 normally, or the control is 
        // garanteed to be partially offscreen
        this.relativeWidth = RelativeWidth;
        this.relativeHeight = RelativeHeight;
        this.relativeX = RelativeX;
        this.relativeY = RelativeY;
    }

    protected override void OnParentChanged(EventArgs e)
    {
        if(previousParent != null)
        {
            previousParent.Resize -= new EventHandler(parentResized);
        }
        if(this.Parent != null)
        {
            this.Parent.Resize += parentResized;
        }
        this.previousParent = this.Parent;
    }

    private void parentResized(Object o, EventArgs e)
    {
        this.Width = (int)(this.Parent.Width * this.relativeWidth);
        this.Height = (int)(this.Parent.Width * this.relativeHeight);

        this.Location = new Point((int)(this.Parent.Width * this.relativeX), (int)(this.Parent.Height * this.relativeY));
    }
}

这是一个很好的解决方案吗?

第二个问题:我想制作Button类(以及Panel和Label类)来扩展这个新版本的控件。但据我所知,这是不可能的。我唯一的选择似乎是制作3个类,并通过“标签”,“按钮”和“面板”逐字地找到并替换“控制”以获得我想要的结果。

我应该在这做什么?

1 个答案:

答案 0 :(得分:0)

我认为你是在TableLayoutPanel控件之后。 令人高兴的是,在.NET平台上,不必再担心子控件调整大小或重新定位到父级。 您必须广泛使用子控件的Dock和Anchor属性。 您可以从链接开始,但网上有很多关于它们的教程。

TableLayoutPanel

Anchor and Dock Child Controls

Create a Resizable Windows Form