#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…
наслаждайтесь!