使System.Windows.Forms.Control的大小依赖于父控件的大小

本文关键字:依赖于 控件 小依 System Forms Control Windows | 更新日期: 2023-09-27 17:50:27

我想让一些控件(特别是:按钮、标签和面板)依赖于它们父控件的大小。所以一个按钮可能是父元素宽度的0.1倍,高度的0.05倍,并且定位在宽度的0.3倍和高度的0.2倍。现在我有两个问题:

首先我想把Control类的行为改变成一种"相对大小和相对位置"的控件。如果Control类有一个我可以重写的' onparentresize '方法,这将是非常容易的,但它没有。现在我的解是这个

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个类,并通过"标签","按钮"answers"面板"找到并替换"控制",以获得我想要的结果。

我应该在这里做什么?

使System.Windows.Forms.Control的大小依赖于父控件的大小

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

TableLayoutPanel

锚和码头子控件

创建可调整大小的Windows窗体