在c#中主窗体控件后面打开的子窗体

本文关键字:窗体 控件 | 更新日期: 2023-09-27 18:28:55

我有一个MDI表单,里面有很多控件,比如按钮、图像、标签、下拉列表等。我已经将表单属性设置为MDIContainer=true。当我单击表单内部的按钮时,将在父级中打开另一个表单。现在它打开了,但不幸的是它打开了所有的控制。如何使子窗体在主窗体的所有控件之前打开?

    Form2 childForm = new Form2();            
    childForm.MdiParent = this;
    childForm.Activate();          
    childForm.Show();

在c#中主窗体控件后面打开的子窗体

通常我们不会Mdi Form添加任何子控件。当Form用作Mdi Form时,它应该包含的唯一子级是MdiClient。该MdiClient将包含您的child forms。所有控件都应放置在Child forms上。然而,如果你想这样做,我们仍然可以让它工作

Mdi Form中包含一个默认的MdiClient。我们可以在Mdi FormControls集合中找到它。它是MdiClient型。这将由Mdi Form的所有其他控件覆盖,这就是为什么默认情况下不能将Child forms置于顶部的原因。为了解决这个问题,我们只需访问MdiClient并调用BringToFont(),只要没有任何Child formVisible,我们就会调用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();