在c#中主窗体控件后面打开的子窗体
本文关键字:窗体 控件 | 更新日期: 2023-09-27 18:28:55
我有一个MDI表单,里面有很多控件,比如按钮、图像、标签、下拉列表等。我已经将表单属性设置为MDIContainer=true。当我单击表单内部的按钮时,将在父级中打开另一个表单。现在它打开了,但不幸的是它打开了所有的控制。如何使子窗体在主窗体的所有控件之前打开?
Form2 childForm = new Form2();
childForm.MdiParent = this;
childForm.Activate();
childForm.Show();
通常我们不会向Mdi Form
添加任何子控件。当Form
用作Mdi Form
时,它应该包含的唯一子级是MdiClient
。该MdiClient
将包含您的child forms
。所有控件都应放置在Child forms
上。然而,如果你想这样做,我们仍然可以让它工作
Mdi Form
中包含一个默认的MdiClient
。我们可以在Mdi Form
的Controls
集合中找到它。它是MdiClient
型。这将由Mdi Form
的所有其他控件覆盖,这就是为什么默认情况下不能将Child forms
置于顶部的原因。为了解决这个问题,我们只需访问MdiClient
并调用BringToFont()
,只要没有任何Child form
是Visible
,我们就会调用MdiClient
上的SendToBack()
来显示您的其他控件(按钮、图像、标签、下拉列表等)。这是供您测试的代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
IsMdiContainer = true;
//Find the MdiClient and hold it by a variable
client = Controls.OfType<MdiClient>().First();
//This will check whenever client gets focused and there aren't any
//child forms opened, Send the client to back so that the other controls can be shown back.
client.GotFocus += (s, e) => {
if (!MdiChildren.Any(x => x.Visible)) client.SendToBack();
};
}
MdiClient client;
//This is used to show a child form
//Note that we have to call client.BringToFront();
private void ShowForm(Form childForm)
{
client.BringToFront();//This will make your child form shown on top.
childForm.Show();
}
//button1 is a button on your Form1 (Mdi container)
//clicking it to show a child form and see it in action
private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2 { MdiParent = this };
ShowForm(f);
}
}
处理Shown
事件并调用this.BringToFront();
。