Winform控件大小位置随窗体变化

发布时间 2023-04-05 23:03:52作者: 奔赴山海Y

1.插入以下方法

        /// <summary>
        /// 读取控件的大小位置属性,保存在Tag里面
        /// </summary>
        /// <param name="control"></param>
        void SetTag(Control control)
        {
            foreach (Control item in control.Controls)
            {
                item.Tag = item.Left.ToString() + "," + item.Top.ToString() + "," + item.Width.ToString() + "," + item.Height.ToString()+",";
                if (item.HasChildren)
                {
                    SetTag(item);
                }
            }
        }
        /// <summary>
        /// 设置控件的大小位置
        /// </summary>
        /// <param name="control"></param>
        /// <param name="scaleX"></param>
        /// <param name="scaleY"></param>
        void SetContrlos(Control control,double scaleX,double scaleY)
        {
            foreach (Control item in control.Controls)
            {
                string stag = (string)item.Tag;
                if (stag == null) return;
                string[] strings = stag.Split(',');
                item.Location = new Point((int)(double.Parse(strings[0]) * scaleX), (int)(double.Parse(strings[1]) * scaleY));
                item.Size = new Size((int)(double.Parse(strings[2]) * scaleX), (int)(double.Parse(strings[3]) * scaleY));
               if (item.HasChildren)
                {
                    SetContrlos(item,scaleX,scaleY);
                }
            }
        }

 

2.在窗体的构造函数和大小事件中插入代码

        public Form1()
        {
            InitializeComponent();
            this.Tag = this.Width.ToString()+","+this.Height.ToString();
            SetTag(this);
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            string stag=(string)this.Tag;
            if (stag == null) return;
            string[] strings=stag.Split(',');
            double x = (double)this.Width / Convert.ToDouble(strings[0]);
            double y = (double)this.Height / Convert.ToDouble(strings[1]);
            SetContrlos(this,x,y);
          
        }