C#Winform 实现控件自适应父容器大小

C#Winform 实现控件自适应父容器大小

在日常开发中经常遇到控件不能随着父容器大小的改变而且自动改变控件的所在位置和大小。以下是实现的代码

	/// <summary>
    /// 根据父容器实现控件自适应大小位置
    /// </summary>
    /// <param name="control">所需自适应大小位置的控件</param>
    private void ChangeLocationSizeByParent (Control control)
    {
        //记录父容器大小,来判断改变控件大小位置是因为父容器的改变还是通过设置控件大小位置去改变
        Size parentOldSize = control.Parent.Size;

        PointF locationPF = new PointF();
        locationPF.X = (float)control.Location.X / (float)control.Parent.Width;
        locationPF.Y = (float)control.Location.Y / (float)control.Parent.Height;
        
        PointF sizePF = new PointF();
        sizePF.X = (float)control.Width / (float)control.Parent.Width;
        sizePF.Y = (float)control.Height / (float)control.Parent.Height;

        control.LocationChanged += delegate (Object o, EventArgs e) {

            if (control.Parent != null&&parentOldSize.Equals(control.Parent.Size))
            {
                locationPF.X = (float)control.Location.X / (float)control.Parent.Width;
                locationPF.Y = (float)control.Location.Y / (float)control.Parent.Height;
               
            }
        };
        control.SizeChanged += delegate (Object o, EventArgs e) {

            if (control.Parent != null && parentOldSize.Equals(control.Parent.Size))
            {
                sizePF.X = (float)control.Width / (float)control.Parent.Width;
                sizePF.Y = (float)control.Height / (float)control.Parent.Height;
               
            }
        };
        control.ParentChanged += delegate (Object o, EventArgs e) {
            if (control.Parent == null)
            {
                return;
            }
            locationPF.X = (float)control.Location.X / (float)control.Parent.Width;
            locationPF.Y = (float)control.Location.Y / (float)control.Parent.Height;
            sizePF.X = (float)control.Width / (float)control.Parent.Width;
            sizePF.Y = (float)control.Height / (float)control.Parent.Height;
        };
        control.Parent.SizeChanged += delegate (Object po, EventArgs pe) {

            Control pControl = (Control)po;
            int x = (int)(pControl.Width * locationPF.X);
            int y = (int)(pControl.Height * locationPF.Y);
            control.Location = new Point(x, y);
            int width = (int)(pControl.Width * sizePF.X);
            int hetght = (int)(pControl.Height * sizePF.Y);
            control.Size = new Size(width, hetght);
            control.Refresh();
            parentOldSize = pControl.Size;
        };
    }

转发请注明出处

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值