C#
Как создать окно в C#: WinForms и WPF
Чтобы создать окно в C#, нужен проект для графического интерфейса: Windows Forms App или WPF. В консольном проекте окно само не появится. В WinForms окно называется Form, в WPF — Window. Для первого учебного примера проще начать с WinForms: добавить вторую форму и открыть ее кнопкой
Создайте WinForms-проект
В Visual Studio выберите:
- Язык C#.
- Создайте проект и откройте дизайнер формы.
Если вы используете старый урок, может встретиться шаблон Windows Forms App (.NET Framework). Для новых проектов чаще подходит современный Windows Forms App
Добавьте второе окно
- Нажмите правой кнопкой по проекту.
- Выберите
Add. - Выберите
Form (Windows Forms). - Назовите файл
SecondForm.cs.
После этого в проекте появится второй класс формы
Откройте окно кнопкой
На главной форме добавьте кнопку и напишите:
private void openButton_Click(object sender, EventArgs e)
{
SecondForm window = new SecondForm();
window.Show();
}
Show() открывает новое окно и позволяет работать с главной формой дальше
Show и ShowDialog
Если окно должно быть диалогом, используйте ShowDialog():
private void settingsButton_Click(object sender, EventArgs e)
{
using SecondForm window = new SecondForm();
window.ShowDialog();
}
Пока диалог открыт, пользователь не сможет вернуться к главной форме. Это удобно для настроек, подтверждений, ввода данных и выбора параметров
Как не открыть десять одинаковых окон
Иногда пользователь нажимает кнопку несколько раз, и приложение открывает много копий одного окна. Если это не нужно, храните ссылку на открытое окно:
private SecondForm? _secondForm;
private void openButton_Click(object sender, EventArgs e)
{
if (_secondForm == null || _secondForm.IsDisposed)
{
_secondForm = new SecondForm();
_secondForm.Show();
}
else
{
_secondForm.Focus();
}
}
Так повторный клик переводит фокус на уже открытое окно
Пример для WPF
В WPF второе окно создается как Window. Пример:
private void OpenButton_Click(object sender, RoutedEventArgs e)
{
SecondWindow window = new SecondWindow();
window.Show();
}
Идея похожая: создаем экземпляр окна и вызываем Show(). Отличаются файлы, разметка и модель интерфейса: в WPF используется XAML, а в WinForms — дизайнер форм и контролы
Как передать данные в окно
Часто окно нужно открыть с текстом или объектом:
SecondForm window = new SecondForm("Новый заказ");
window.Show();
Тогда в SecondForm создают конструктор с параметром и сохраняют значение в поле или сразу выводят его в Label
Если окно должно не только получить данные, но и вернуть их обратно, не смешивайте оба сценария в одном обработчике. Для простого возврата используйте ShowDialog() и публичное свойство результата. Для постоянного обмена между окнами лучше передать ссылку, сервис или событие. Так код остается читаемым: понятно, окно просто открывается, возвращает результат или живет как отдельная часть интерфейса
Еще один практический момент — имя файла. Form2 годится для первого урока, но в рабочем проекте лучше SettingsForm, OrderForm, ProductEditForm. Через неделю такие имена сэкономят больше времени, чем кажется
Частые ошибки
Первая ошибка — создавать окно в Console App и ждать дизайнер формы. Вторая — забыть добавить новую форму в проект. Третья — открыть форму через Show(), хотя нужен модальный диалог. Четвертая — каждый раз создавать новое окно, хотя нужно обновить уже открытое. Пятая — писать код в файле дизайнера вместо файла формы
Мини-задача: создайте главное окно с кнопкой «Открыть». По клику открывайте второе окно через Show(). Затем замените Show() на ShowDialog() и проверьте разницу в поведении
Что почитать дальше по C#
- C# и .NET Framework: что выбрать новичку
- Как установить .NET SDK для C#
- Ошибки C#: cannot convert, null reference и missing using
- Рубрика C#
Источники: Microsoft WinForms, Form.Show, WPF windows
Что почитать дальше по C#
Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:
- Как создать форму в си шарп: первый Windows Forms пример
- C# с нуля: первый проект через dotnet new
- Как добавить корзину в WPF-проекте на C#
- Как обратиться к форме в C#: безопасный способ для WinForms