2013-08-26 3 views
1

У меня есть форма MDI с большим количеством элементов управления внутри нее, как кнопка, изображения, ярлык, выпадающее меню и т. Д. Я создал свойство формы isMDIContainer = true. Когда я нажимаю на кнопка внутри формы, другая форма должна быть открыта внутри родителя. Теперь ее открытие, но, к сожалению, ее открытие за всеми элементами управления. Как сделать дочернюю форму открытой наружу всех элементов управления основной формы?Форма ребенка, открытая за элементами управления основной формы в C#

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

То, о чем вы спрашиваете, насколько мне известно, не является одновременно возможным и практичным. Хотя вы можете поместить элементы управления в контейнер MDI, это в основном для использования панелей инструментов и StatusBars. MDIChildren всегда отображаются под основными элементами формы. – Adrian

+0

Если OP решил пойти с методом, описанным в ответе на этот вопрос, я бы предложил использовать событие Form.Closing, чтобы сообщить родительской форме, что ребенок закрывается, поэтому он может оценить, будет ли он делать панель меню появляться или исчезать, а не тратить циклы процессора на таймер, когда 99 циклов из 100 он ничего не собирается с ним делать. – Adrian

+0

@Adrian. Принятый ответ на этот вопрос не обязательно тот, с которым я бы пошел. В других ответах и ​​ссылках в этом вопросе есть и другие хорошие идеи. Один из них должен работать для OP –

ответ

2

Обычно мы не добавьте любые элементы управления для детей в 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);   
    }  
} 
+0

Действительно хорошее решение с одним оговоркой: если пользователь минимизирует форму, а не закрывает ее, обработчик событий lambda 'GotFocus' не запускается, поэтому' MdiClient' не возвращается в обратную сторону. Теперь это не обязательно плохо, поскольку, если бы это было так, вы бы не смогли увидеть свернутую форму, но это то, о чем нужно знать. – Adrian

+0

@Adrian, когда дочерняя форма сведена к минимуму, 'MdiClient' все равно должен быть сверху, он будет отправлен обратно только тогда, когда все дочерние формы будут скрыты/закрыты. Это по дизайну. –

+0

, как я уже сказал, не обязательно плохо. Я просто думаю об этом с точки зрения кого-то, не совсем знакомого с тем, как работает MDI и каковы их ожидания в отношении использования. – Adrian

-1

Ручка Shown события и вызвать this.BringToFront();.

+0

Это все еще не приносит дочернюю форму перед элементами управления, указанными на MDIContainer. Проблема состоит в том, что элементы управления плавают перед панелью, которая формирует область MDIContainer, которая показывает формы MDIChild. – Adrian

Смежные вопросы