开发中碰到一个问题,一个窗体里需要集成比较多的功能,并且这种是相互独立的。为了降低主窗体的复杂性,就想到在主窗体的控件里直接打开子窗体的方式。这样,相关的控件和逻辑就可以集成在各自的子窗体里,主窗体就可以简单了。
由于子窗体是原来的弹出窗口,因此,想直接打开,但是,发现子窗口无法随主窗口改变大小。查了很多资料也没有找到所以然,后来自己逐个测试才发现窍门,解决了子窗体大小随动的问题,子窗体的几个关键参数:
- WindowState=Normal;
- ControlBox=False;//不显示窗体操作的按钮
- Text="";//不要设置文本,否则,顶部标题条会显示出来。
两个窗体通过相互共享一个label来演示一下消息实时互传的方法,注意将需要外部访问的控件的Modifiers=Public,相当于开放外部访问。
完整的项目如下:
1、form1的设计
2、form1的代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Form2 fm2 = null;
private void btOpen_Click(object sender, EventArgs e)
{
if (fm2 == null)
{
fm2 = new Form2(this);
fm2.TopLevel = false;
fm2.Dock = DockStyle.Fill;
fm2.Parent = splitContainer1.Panel2;
fm2.Show();
}
else
{
fm2.Show();
}
}
private void btClose_Click(object sender, EventArgs e)
{
if (fm2 != null)
{
fm2.Hide();
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (fm2 != null)
fm2.lbFm1.Text = textBox1.Text;
}
}
3、form2的设计
4、form2的代码
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
Form1 fm1;
public Form2(Form1 fm1)
{
InitializeComponent();
this.fm1 = fm1;
}
private void btClose_Click(object sender, EventArgs e)
{
Close();
}
private void Form2_SizeChanged(object sender, EventArgs e)
{
//主窗体尺寸改变时,会触发子窗体的尺寸改变事件。
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
fm1.lbFm2.Text = textBox1.Text;
}
}
5、效果图
2021年12月27日