Я столкнулся с аналогичной проблемой в приложении, которое писал. Моим основным интерфейсом была форма, работающая в главном потоке. У меня был диалог помощи, который я хотел запустить как немодальный диалог. Это было легко реализовать, даже до того момента, когда у меня был только один запущенный диалог справки. К сожалению, любые модальные диалоги, которые я использовал, приводили к тому, что диалог справки также терял фокус - когда это было во время работы некоторых из этих модальных диалогов, было бы очень полезно иметь диалоговое окно справки.
Используя идеи, упомянутые здесь и в других местах, мне удалось преодолеть эту ошибку.
Я объявил поток внутри моего основного интерфейса.
Thread helpThread;
Следующий код относится к событию, которое вызывается для открытия диалогового окна справки.
private void Help(object sender, EventArgs e)
{
//if help dialog is still open then thread is still running
//if not, we need to recreate the thread and start it again
if (helpThread.ThreadState != ThreadState.Running)
{
helpThread = new Thread(new ThreadStart(startHelpThread));
helpThread.SetApartmentState(ApartmentState.STA);
helpThread.Start();
}
}
void startHelpThread()
{
using (HelpDialog newHelp = new HelpDialog(resources))
{
newHelp.ShowDialog();
}
}
Мне также потребовалась инициализация потока, добавленного в мой конструктор, чтобы убедиться, что я не ссылался на нулевой объект при первом запуске этого кода.
public MainWindow()
{
...
helpThread = new Thread(new ThreadStart(startHelpThread));
helpThread.SetApartmentState(ApartmentState.STA);
...
}
Это гарантирует, что поток имеет только один экземпляр в любой момент времени. Сам поток запускает диалог и останавливается после закрытия диалога. Поскольку он запускается в отдельном потоке, создание модального диалога из основного пользовательского интерфейса не приводит к зависанию диалогового окна справки. Мне нужно было добавить
helpDialog.Abort();
к событию закрытия формы моего основного пользовательского интерфейса, чтобы убедиться, что диалоговое окно справки закрывается при завершении приложения.
Теперь у меня есть немодальное диалоговое окно справки, на которое не влияют никакие модальные диалоговые окна, порожденные из моего основного пользовательского интерфейса, и это именно то, что я хотел. Это безопасно, поскольку не требуется связь между основным пользовательским интерфейсом и диалоговым окном справки.