Обычно мы не добавьте любые элементы управления для детей в Mdi Form
. Когда Form
используется как Mdi Form
, единственным ребенком, который он должен содержать, является MdiClient
. Это MdiClient
будет содержать ваши child forms
. Все элементы управления должны быть размещены на Child forms
. Однако, если вы этого хотите, мы все равно можем работать.
Существует номер по умолчанию MdiClient
, содержащийся в Mdi Form
. Мы можем найти его в Controls
коллекции Mdi Form
. Это тип MdiClient
. Это будет охватывать все остальные элементы управления вашего Mdi Form
, и поэтому ваш Child forms
не может быть включен сверху по умолчанию. Чтобы решить эту проблему, просто мы должны получить доступ к MdiClient
и позвонить по номеру BringToFont()
и всякий раз, когда нет Child form
, являющегося Visible
, мы позвоним SendToBack()
на MdiClient
, чтобы показать остальные элементы управления (кнопка, изображения, ярлык, выпадающий список и т. Д.). , Вот вам код:
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);
}
}
То, о чем вы спрашиваете, насколько мне известно, не является одновременно возможным и практичным. Хотя вы можете поместить элементы управления в контейнер MDI, это в основном для использования панелей инструментов и StatusBars. MDIChildren всегда отображаются под основными элементами формы. – Adrian
Если OP решил пойти с методом, описанным в ответе на этот вопрос, я бы предложил использовать событие Form.Closing, чтобы сообщить родительской форме, что ребенок закрывается, поэтому он может оценить, будет ли он делать панель меню появляться или исчезать, а не тратить циклы процессора на таймер, когда 99 циклов из 100 он ничего не собирается с ним делать. – Adrian
@Adrian. Принятый ответ на этот вопрос не обязательно тот, с которым я бы пошел. В других ответах и ссылках в этом вопросе есть и другие хорошие идеи. Один из них должен работать для OP –