【Winform】panel内显示多个子form切换显示
类似NavigationFrame可翻页
1.panel显示子窗体
public partial class MainForm : Form { Form1 frm1 = new Form1(); Form2 frm2 = new Form2(); Form3 frm3 = new Form3(); public MainForm() { InitializeComponent(); } private void button_page1_Click(object sender, EventArgs e) { if (!this.panel1.Controls.Contains(frm1)) //如果panel中不包含form1,就将它添加到Panel中 { frm1.TopLevel = false; //将form1的TopLevel设为false,否则无法在panel中显示顶级窗体 frm1.FormBorderStyle = FormBorderStyle.None; //不显示边框 this.panel1.Controls.Add(frm1); //form1添加到panel中 frm1.Show(); //显示 } frm1.BringToFront(); //后添加的form会被前面添加的form挡住,所以每次显示时要放到最前 } private void button_page2_Click(object sender, EventArgs e) { if (!this.panel1.Controls.Contains(frm1)) { frm2.TopLevel = false; frm2.FormBorderStyle = FormBorderStyle.None; this.panel1.Controls.Add(frm2); frm2.Show(); } frm2.BringToFront(); } private void button_page3_Click(object sender, EventArgs e) { if (!this.panel1.Controls.Contains(frm1)) { frm3.TopLevel = false; frm3.FormBorderStyle = FormBorderStyle.None; this.panel1.Controls.Add(frm3); frm3.Show(); } frm3.BringToFront(); } }
2.子窗体大小自适应
- 计算比例:p=容器/控件
- 新控件width=px*width,height=py*height
- 子窗体内有控件,对控件内的控件进行递归设置大小,直到没有内部没有子控件的控件。
Form1 frm1 = new Form1(); Form2 frm2 = new Form2(); Form3 frm3 = new Form3(); public MainForm() { InitializeComponent(); } private void button_page1_Click(object sender, EventArgs e) { if (!this.panel1.Controls.Contains(frm1)) //如果panel中不包含form1,就将它添加到Panel中 { frm1.TopLevel = false; //将form1的TopLevel设为false,否则无法在panel中显示顶级窗体 frm1.FormBorderStyle = FormBorderStyle.None; //不显示边框 this.panel1.Controls.Add(frm1); //form1添加到panel中 frm1.Show(); //显示 selfAdoption(frm1, this.panel1); } frm1.BringToFront(); //后添加的form会被前面添加的form挡住,所以每次显示时要放到最前 } private void button_page2_Click(object sender, EventArgs e) { if (!this.panel1.Controls.Contains(frm2)) { frm2.TopLevel = false; frm2.FormBorderStyle = FormBorderStyle.None; this.panel1.Controls.Add(frm2); frm2.Show(); selfAdoption(frm2, this.panel1); } frm2.BringToFront(); } private void button_page3_Click(object sender, EventArgs e) { if (!this.panel1.Controls.Contains(frm3)) { frm3.TopLevel = false; frm3.FormBorderStyle = FormBorderStyle.None; this.panel1.Controls.Add(frm3); frm3.Show(); selfAdoption(frm3, this.panel1); } frm3.BringToFront(); } public void selfAdoption(Control con, Control objectCon) { float proportionX = objectCon.Width / Convert.ToSingle(con.Width); //计算比例 float proportionY = objectCon.Height / Convert.ToSingle(con.Height); SetControl(proportionX, proportionY, con); } /// <summary> /// 按照比例缩放控件大小 /// </summary> /// <param name="proportionX">宽度比例</param> /// <param name="proportionY">高度比例</param> /// <param name="con">控件</param> public void SetControl(float proportionX, float proportionY, Control con) { foreach (Control ctl in con.Controls) { //修改子窗体尺寸 ctl.Width = Convert.ToInt32(proportionX * ctl.Width); ctl.Height = Convert.ToInt32(proportionY * ctl.Height); //相对位置调整 ctl.Left = Convert.ToInt32(ctl.Left * proportionX); ctl.Top = Convert.ToInt32(ctl.Top * proportionY); //递归修改子窗体内部控件尺寸 if (ctl.Controls.Count > 0) //子窗体内部有控件 { SetControl(proportionX, proportionY, ctl); } } }
标签:
WinForm
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤