Отображение формы в консольном приложении в определенный момент (в середине выполнения)

#c# #winforms

#c# #winforms

Вопрос:

Я хотел бы отобразить форму в середине консольного приложения, чтобы отобразить некоторую информацию о состоянии и автоматически закрыть форму при возникновении определенного события. Будет ли следующей части кода достаточно для этой цели?

Отображать форму

 ModuleInitializerForm moduleInitializerDlg = new ModuleInitializerForm()
{
  Parent = parent,
  TopMost = true,
  TopLevel = true,
  Text = Common.MESSAGE_INFO_TITLE,
  ControlBox = false,
  FormBorderStyle = FormBorderStyle.FixedDialog,
  KeyPreview = false,
};

moduleInitializerDlg.Initialize();
moduleInitializerDlg.ShowDialog(); 
  

Закройте форму

 public void OnModuleInitializationCompleted(object sender, EventArgs e)
  {
    if (this.InvokeRequired)
    {
      this.BeginInvoke(new ECEventsHandler(OnModuleInitializationCompleted), sender, e);
    }
    else
    {
      this.Close();
    }
  }
  

Комментарии:

1. Вы запускаете форму в ее собственном потоке?

2. Я не понимаю вопроса. Я что-нибудь пропустил?

3. @Maanu: (расширяющий комментарий Лассе) проблема с использованием ShowDialog заключается в том, что выполнение потока блокируется до тех пор, пока форма не будет закрыта. Следовательно, если у вас есть только один поток, эта форма никогда не будет закрыта событием, запущенным в том же потоке…

4. @digEmAll: ShowDialog будет вызван из одного потока, а OnModuleInitializationCompleted будет вызван потоком threadpool

5. @Jodrell В управляемом коде нет настоящего «консольного приложения». Вместо этого «консольное приложение» может выполнять запись в консоль, а также показывать окна Winforms / WPF (если оно этого хочет и ссылается на правильные сборки). Разница в том, что при выборе «Консольное приложение» в качестве вывода всегда отображается консоль, т. Е. она открывается, если приложение запущено не с консоли.

Ответ №1:

Поскольку вы используете ShowDialog(), поток, в котором это делается, будет заблокирован до тех пор, пока пользователь (или вы) не закроете форму.

Обратите внимание, что если вместо этого вы использовали Show(), поток продолжится. Однако, если у вас никто не отправляет сообщения Windows в этот поток, форма будет «мертвой», то есть она ни на что не будет реагировать. Если вы начинаете с обычного проекта консольного приложения, то так и будет. Если вы используете ShowDialog(), это создает локальный цикл сообщений, поэтому окно отвечает.

Поэтому вам понадобится отдельный поток для пользовательского интерфейса Windows Forms, где вы показываете форму. Я бы использовал Application.Run(moduleInitializerDlg); вместо ShowDialog() , поскольку это лучше настраивает / разрушает архитектуру передачи сообщений, насколько я могу судить. Кстати, этот вызов заблокирует поток таким же образом, как и ShowDialog().

Комментарии:

1. Вы могли бы запустить свой рабочий поток перед вызовом Application.Run() , но убедитесь, что обработчик все еще работает, если форма еще не была показана.

Ответ №2:

перейдите к свойствам формы, которая должна открыться по щелчку… перейдите в раздел Layout и установите начальную позицию в Centercreen или, если у вас есть родительский элемент, в котором вы хотите закреплять его каждый раз, используйте CenterParent…

наслаждайтесь!