Как показать модальный диалог WinForms из ветки приложения WPF - PullRequest
1 голос
/ 26 сентября 2011

У меня есть приложение WPF. Главное окно этого приложения имеет кнопку. Я открываю модальное диалоговое окно WinForms в отдельной теме, когда нажимается эта кнопка. Проблема, с которой я столкнулся, заключается в том, что диалог не ведет себя как модальный, т. Е. Все еще можно переключить фокус на главное окно, в то время как мне требуется разрешить фокусировку на только что открывшемся диалоге, и не должно быть возможности выбора основного окно.

Примечание: я не могу переместить modalDialog.ShowDialog(); за пределы делегата, потому что диалоговая форма создает элементы управления динамически, и это означает, что эти элементы управления должны оставаться в потоке, в котором они были созданы. Чтобы быть более понятным, если я переместу modalDialog.ShowDialog(); наружу, я получу исключение, например, так:

Операция между потоками не разрешена: элемент управления 'DynamicList' доступен из потока, отличного от того, в котором он был создан.

Есть идеи, как заставить форму вести себя как модал?

Вот код:

private void button1_Click(object sender, RoutedEventArgs e)
{
   DoSomeAsyncWork();
}

private void DoSomeAsyncWork()
{ 
  var modalDialog = new TestForm();
  var backgroundThread = new Thread((
     delegate()
     {
          // Call intensive method that creates dynamic controls
          modalDialog.DoSomeLongWaitingCall();
          modalDialog.ShowDialog();
     }
   ));
  backgroundThread.Start();
}

1 Ответ

2 голосов
/ 26 сентября 2011

Вы всегда должны создавать элементы управления в потоке пользовательского интерфейса.Если вы сделаете это, вызов от ShowDialog() до Dispatcher должен работать.

...