2009-02-24 6 views
2

У меня есть приложение Winforms, которая использует показать несколько окон верхнего уровня:C# Winforms: Несколько окон верхнего уровня и ShowDialog()

Form1 form1 = new Form1(); 
form1.Show(); 
Form2 form2 = new Form2(); 
form2.Show(); 
Application.Run(); 

Внутри одного из событий обработчиков в Form1, я хотел бы быть способный показать модальный диалог:

Dialog dialog = new Dialog(); 
dialog.ShowDialog(form1); 

без приостановки другого верхнего уровня окна.

Возможно ли это?

ответ

5

Вам нужно будет запустить каждое окно верхнего уровня на его собственной ленте STA, чтобы этого достичь, я считаю.

1

Если вам нужен альтернативный метод для запуска нескольких потоков пользовательского интерфейса, вы можете обрабатывать сообщение WM_ENABLE и использовать метод EnableWindow для предотвращения блокировки формы.

0

После того, как вы покажете модальное диалоговое окно, оно сделает все остальные окна на одном и том же потоке STA непригодными для использования. Причина этого заключается в том, что модальный диалог начнет перехватывать все сообщения для этого конкретного потока. Другие окна верхнего уровня не смогут отвечать, пока модальный диалог не будет закрыт.

+1

Причина, по которой Windows перестает отвечать, заключается в том, что .NET проходит через каждое окно верхнего уровня в потоке и вызывает EnableWindow (false). –

2

Существует простое решение, которое работает нормально. Вы можете просто проверить, отключены ли мы и при необходимости снова включите.

[DllImport("user32.dll")] 
    private static extern void EnableWindow(IntPtr handle, bool enable); 

    protected override void WndProc(ref System.Windows.Forms.Message msg) 
    { 
     if (msg.Msg == 0x000a /* WM_ENABLE */ && msg.WParam == IntPtr.Zero) 
     { 
      EnableWindow(this.Handle, true); 
      return; 
     } 

     base.WndProc(ref msg); 
    }