Показать модальный диалог (самый верхний) в новой теме - PullRequest
1 голос
/ 03 ноября 2011

Модальное диалоговое окно с самым верхним свойством, установленным в true, не отображается как самое верхнее при отображении в новом потоке. Пример кода:

Thread thread = new Thread(KickOffForm);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

private void KickOffForm(object state)
{
    Thread.Sleep(5000); // Mimics logic that takes place before form is shown

    var form = new Form2();
    form.ShowDialog();
}

Модальное диалоговое окно появляется как самое верхнее, если форма создается в начале потока. Пример кода:

Thread thread = new Thread(KickOffForm);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

private void KickOffForm(object state)
{
    var form = new Form2();

    Thread.Sleep(5000); // Mimics logic that takes place before form is shown

    form.ShowDialog();
}

Приведенный выше код выполняется в классе, который создается при запуске exe.

Почему форма появляется как самая верхняя, когда создается в начале потока, а не если создается позже?

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Возможно, вы могли бы вызвать диалоговое окно в правильном потоке:

   public partial class Form1 : Form
   {
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click( object sender, EventArgs e )
    {
        Thread thread = new Thread( KickOffForm );
        thread.SetApartmentState( ApartmentState.STA );
        thread.Start();

    }

    private void KickOffForm( object state )
    {
        var form = new Form2();

        Thread.Sleep( 5000 ); // Mimics logic that takes place before form is shown

        this.Invoke( (Action)(() => { form.ShowDialog(); }) );
    }
}
1 голос
/ 03 ноября 2011

Формы могут быть модальными только по отношению к потоку, в котором они созданы.

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

Это должно быть так, потому что каждый поток запускает свой собственный цикл сообщений. Один поток ничего не знает ни о каком цикле сообщений в другом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...