2013-08-19 2 views
2

Итак, я искал похожие темы в stackoverflow и на других интернет-форумах и базах знаний, но до сих пор мне не повезло, пытаясь решить эту проблему. I «Мы боремся целую неделю. Вот код:Настройка свойства MdiParent формы прерывает/предотвращает запуск события Shown

private void matrículasToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Form1 form1 = new Form1(); 
     form1.Show(); 
     form1.MdiParent = this; // this == the main form of the aplication, wich has IsMdiParent property set to true. 
    } 

Если я вывезти «form1.MdiParent = это», показанное событие Form1 будет срабатывать нормально, выполняя все содержимое своего проводника, но если я пусть его там, показано событие формы1 не срабатывает (я установил breakpoits, ни один из них не был вызван).

Любопытно, что если я использую событие Load вместо Показано, что все работает нормально, но я немного боюсь, что если подкачка Показаный Нагрузки бы сломать что-то :(.

+0

Я нашел его, обновил свой ответ –

ответ

4

Попробуйте этот код

Form1 form1 = new Form1(); 
//Subscribe event here 
form1.MdiParent = this; 
form1.Show(); 

Это работает для меня

Я не знаю, почему ваш код не работает, я вернусь, как только я получаю ответ.

Редактировать: У меня есть ответ.

ISynchronizationInvoke's членов (Invoke и BeginInvoke) выполнены следующим образом: Control.

  1. Получает контекст Thread, который создал окно.
  2. Сформировать новое окно MESSAGEID с помощью RegisterWindowMessage
  3. Инкапсулируй делегат мы прошли в качестве параметра в ThreadMethodEntry добавить его во внутреннее Queue
  4. сообщений Управляющего сообщение для потока в очереди с MESSAGEID возвращенного RegisterWindowMessage использованием PostMessage
  5. Ручкой WndProc прослушивает для messageId, затем De-queues ThreadMethodEntry и вызывает делегата.

Что поделать не так?

Form1 form1 = new Form1(); form1.Show(); form1.MdiParent = this;

Form.Show каким-то образом приводит к вызову OnLoad метода, то есть где OnShown вызывается асинхронно с помощью BeginInvoke

if (base.IsHandleCreated) 
{ 
    base.BeginInvoke(new MethodInvoker(this.CallShownEvent));//reflected code 
} 

Так что прежде посланной WindowMessage получает установить form1.MdiParent = this;, который, в свою очередь вынуждает управление Destroy это ручка и ReCreate новый ручка.

DestroyHandle метод глотает отправил сообщение, получив его, используя PeekMessage функцию, а затем перечисляет все элементы в Queue и устанавливает свое состояние как завершенные без вызова делегата, но пометив его бросить ObjectDisposedException.

Form1 form1 = new Form1(); 
form1.Show(); 
Action del =() => 
{ 
    Console.WriteLine("This will never be called");//our custom delegates too fails to be invoked 
}; 
var res = form1.BeginInvoke(del); 
//after some more code 
form1.EndInvoke(res);//throws `ObjectDisposedException` which was marked previously 
form1.MdiParent = this; 

метания ObjectDisposedException("Control") фактически вводит в заблуждение, не так ли?

Примечание: вы можете исправить это легко, используя Application.DoEvents(); до form1.MdiParent = this;, так как DoEvents обрабатывает все незавершенные сообщения немедленно.

+0

OMG, большое вам спасибо !, не могу поверить, что я боролся с этой штукой в ​​течение недели, и решение было таким простым: O – user1126775

+0

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

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