【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);
}
}
}
posted @   徘徊彼岸花  阅读(340)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示