C # Winforms: несколько окон верхнего уровня и ShowDialog () - PullRequest
2 голосов
/ 24 февраля 2009

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

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 24 февраля 2009

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

2 голосов
/ 17 августа 2011

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

    [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);
    }
1 голос
/ 24 февраля 2009

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

0 голосов
/ 24 февраля 2009

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

...