Простой пример: Windows Forms и конвертер Цельсий → Фаренгейт

Windows Forms — это фреймворк в Visual Studio для создания настольных приложений с графическим интерфейсом. Вы перетаскиваете элементы (кнопки, метки, текстовые поля) на дизайнерскую форму и настраиваете их свойства: шрифт, цвет, размер и т. д.
В качестве практической задачи мы реализуем простой конвертер температур: вводите Цельсии, нажимаете кнопку — получаете Фаренгейты. Для примера использовалась Visual Studio 2019 Community Edition, но инструкции применимы и к другим версиям Visual Studio с поддержкой .NET Core/NET.
Что вы получите в итоге
- Рабочее WinForms-приложение с полем ввода Цельсия и результатом в Фаренгейтах.
- Как связать событие кнопки с методом в коде (Code-Behind).
- Как запускать, отлаживать и упаковать приложение.
Важно: код и примеры ориентированы на C# и .NET Core 3.1 / .NET 5+. Для других платформ подойдёт адаптация.
Как создать проект Windows Forms в Visual Studio
- Откройте Visual Studio и выберите Создать новый проект.
- В списке шаблонов найдите Windows Form App (или Windows Forms App) и выберите его.
Если опция отсутствует, откройте Visual Studio Installer и добавьте рабочую нагрузку .NET desktop development (Разработка рабочих столов .NET).
Укажите имя проекта и папку для хранения файлов.
На следующем экране для примера выберите .NET Core 3.1 (можно выбрать и более новые версии, см. раздел совместимости).
Нажмите Создать.
После создания проект откроется в среде разработки, и вы увидите форму (canvas) — белое рабочее пространство для размещения элементов.
Как добавить элементы на форму
Холст — это пространство, где вы размещаете элементы интерфейса. Изменяйте размер холста перетаскиванием за маркеры по краям.
- Откройте меню View и выберите Toolbox (Панель элементов).
На панели элементов найдите кнопку, метки (Label) и текстовые поля (TextBox). Закрепите панель, если хотите, щёлкнув по иконке закрепления.
Перетащите на форму одну кнопку, три метки и два текстовых поля.
- Расположите элементы так, чтобы интерфейс выглядел понятно: заголовок, поле ввода для Цельсия, поле для Фаренгейта и кнопка «Вычислить».
Выделите элемент и откройте окно Properties (Свойства), чтобы установить текст, имя, размер шрифта и другие параметры.
Пример свойств для компонентов (переведено и локализовано):
| Элемент | Свойство | Новое значение |
|---|---|---|
| label1 | Text | Celsius to Fahrenheit |
| label1 | Font.Size | 22pt |
| label2 | Text | Celsius |
| label3 | Text | Fahrenheit |
| button1 | Text | Calculate |
| fahrenheitTextBox | ReadOnly | True |
Вместо label1/label2 можно использовать понятные имена.
Совет: держите текст элементов коротким и понятным. Для локализации учитывайте десятичный разделитель и формат чисел.
Связывание событий и написание кода (Code-Behind)
Событие — это действие пользователя (клик, ввод, выбор). Для кнопки обычно обрабатывают событие Click.
C# — основной язык для разработки WinForms. Если вы не знакомы с C#, изучите основы: типы данных, методы, исключения.
- Дважды кликните на кнопку Calculate в дизайнере. Visual Studio автоматически создаст метод обработчика в Form1.cs с подписью:
private void calculateButton_Click(object sender, EventArgs e)
{
// сюда добавим код
}Дайте понятные имена текстовым полям в свойствах: celsiusTextBox и fahrenheitTextBox.
Пример реалистичного и безопасного кода с проверкой ввода:
private void calculateButton_Click(object sender, EventArgs e)
{
// Получаем текст из текстового поля
string input = celsiusTextBox.Text?.Trim();
// Проверяем пустой ввод
if (string.IsNullOrEmpty(input))
{
MessageBox.Show("Введите значение в градусах Цельсия", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
// Пытаемся распарсить значение с учётом локали
// Используем TryParse, чтобы избежать исключений при неверном формате
if (!double.TryParse(input, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.CurrentCulture, out double celsiusValue))
{
// Если локаль использует запятую, но пользователь ввёл точку, пробуем инвариантную культуру
if (!double.TryParse(input, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out celsiusValue))
{
MessageBox.Show("Неверный формат числа. Используйте десятичный разделитель, принятый в вашей системе.", "Ошибка формата", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
// Применяем формулу перевода
double result = (celsiusValue * 9.0 / 5.0) + 32.0;
// Форматируем результат с учётом локали
fahrenheitTextBox.Text = result.ToString("G", System.Globalization.CultureInfo.CurrentCulture);
}Примечания:
- Используйте TryParse, чтобы не получать исключения при неверном вводе.
- Обработка локали важна: в некоторых странах десятичный разделитель — запятая.
- Не делайте всем полям AllowUserToEdit=false, если хотите позволить пользователю копировать результат.
Запуск и отладка приложения
Запуск в Visual Studio
Чтобы запустить проект, нажмите зелёную кнопку Play (Запуск) на панели инструментов.
В появившемся окне формы введите значение в поле Цельсия и нажмите Calculate. Результат появится в поле Фаренгейта.
DPI и размытие на HiDPI-экранах
Если приложение выглядит размытым, оно может не быть DPI-aware. Для корректного масштабирования в современных дисплеях добавьте манифест приложения:
- В обозревателе решений правой кнопкой по проекту TemperatureConverter → Add → New Item.
- Выберите Application Manifest File (app.manifest) и добавьте его.
Внутри app.manifest включите установки DPI, например:
true
true
После изменения остановите отладку и запустите приложение снова.
Отладка с помощью точек останова
Чтобы найти ошибку в логике:
- Откройте Form1.cs и найдите метод calculateButton_Click.
- Кликните на серую область слева от строки — появится красный круг (breakpoint).
- Запустите приложение и нажмите кнопку Calculate. Выполнение остановится на точке останова, и вы сможете просмотреть значения переменных.
- Чтобы продолжить, нажмите Continue (F5).
Как запустить программу без Visual Studio
Сборка генерирует исполняемый файл. Путь по умолчанию (Debug):
Найдите исполняемый файл и запустите его двойным кликом.
Расширение функционала и устойчивость приложения
Ниже собраны рекомендации и готовые шаблоны для улучшения приложения, тестирования и ввода в продакшен.
Валидация ввода и UX
- Ограничьте ввод в поле celsiusTextBox с помощью событий KeyPress, чтобы не допускать букв.
- Отображайте подсказки (placeholder) и формат ввода.
- Позвольте пользователю выбирать разделитель десятичной части или автоматически распознавайте и конвертируйте точки и запятые.
Пример обработчика KeyPress (чтобы разрешить цифры, точку и запятую, а также знаки минус и Backspace):
private void celsiusTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
char ch = e.KeyChar;
if (!char.IsDigit(ch) && ch != 8 && ch != '-' && ch != ',' && ch != '.')
{
e.Handled = true; // игнорируем ввод
}
}Логирование и обработка исключений
- Заворачивайте потенциально опасные места в try/catch и логируйте ошибки в файл или Event Log.
- Для простого приложения MessageBox пригоден для показа ошибок, но в реальных проектах используйте централизованное логирование.
Локализация и формат чисел
Учтите, что разные регионы используют разные разделители. Для корректного отображения чисел используйте CultureInfo.CurrentCulture при парсинге и форматировании.
Производительность и масштабируемость
WinForms ориентирован на настольные приложения и не предназначен для высоконагруженных вычислений в UI-потоке. Для тяжёлой работы выполняйте расчёты в фоновых потоках (Task, BackgroundWorker) и обновляйте UI через Invoke/BeginInvoke.
Безопасность и права доступа
- Собирайте минимум данных.
- Если приложение читает/записывает файлы, учитывайте права пользователя и защищайте данные при необходимости (шифрование, доступ к профилю пользователя).
Тестирование: кейсы и критерии приёмки
Критерии приёмки
- При вводе 0°C приложение выдаёт 32°F.
- При вводе -40°C приложение выдаёт -40°F.
- При вводе дробного числа (например, 36.6 или 36,6) приложение корректно парсит и вычисляет результат в текущей локали.
- При пустом или неверном вводе приложение показывает понятное сообщение об ошибке и не падает.
Тест-кейсы (мини):
- Ввод: 0 → ожидаемый результат: 32
- Ввод: 100 → ожидаемый результат: 212
- Ввод: -40 → ожидаемый результат: -40
- Ввод: “abc” → ожидается сообщение об ошибке
- Ввод: “36,6” в локали с запятой → ожидаемый числовой результат
- UI: Проверить, что поле Fahrenheit — только для чтения
Миграция и совместимость
- WinForms в .NET Framework и WinForms в .NET Core/NET 5+ имеют различия. Если проект на .NET Framework, миграция на .NET Core потребует проверки зависимостей.
- Для современных приложений рассмотрите альтернативы: WPF (для богатого интерфейса и MVVM), MAUI (кроссплатформенно), Electron/Blazor Desktop (гибридные решения).
Сравнение (кратко):
- WinForms: простой, быстрый для небольших бизнес-приложений.
- WPF: мощный UI и привязки данных, steeper learning curve.
- MAUI: кроссплатформенность для мобильных и десктопа.
Когда WinForms НЕ подходит
- Если нужен современный адаптивный UI с векторной графикой и анимациями. В этом случае лучше WPF.
- Если требуется кроссплатформенность (Linux/macOS) — рассмотрите MAUI или web-решения.
- Если приложение должно масштабироваться горизонтально и быть распределённым — WinForms не даст преимуществ.
Полезные сценарии и чек-листы по ролям
Разработчик — чек-лист
- Присвоены понятные имена элементам (celsiusTextBox, fahrenheitTextBox, calculateButton).
- Реализована валидация и безопасный парсинг (TryParse).
- Логирование ошибок добавлено.
- Юнит-тесты на критические вычисления (если применимо).
Тестер — чек-лист
- Проверить граничные значения и отрицательные числа.
- Протестировать локали с разными разделителями.
- Тестировать на HiDPI дисплеях.
Дизайнер — чек-лист
- Контраст текста и фона соответствует требованиям доступности.
- Размеры шрифтов читаемы на типичных экранах.
- Кнопки и поля достаточно большие для удобства взаимодействия.
Мини-методология разработки (быстрая)
- Спроектируйте UI на бумаге.
- Разместите элементы на форме и присвойте имена.
- Напишите обработчик события кнопки с валидацией.
- Добавьте юнит-тесты и ручное тестирование.
- Проведите тесты на разных локалях и DPI.
- Подготовьте манифест и соберите релиз.
Рекомендации по развёртыванию
- Соберите релизную конфигурацию (Release).
- Для простого распространения можно скопировать папку с exe и зависимостями.
- Для крупных проектов используйте установщики (MSIX, Inno Setup) или ClickOnce.
Частые ошибки и способы их устранения
- Приложение не парсит число с запятой → используйте CultureInfo и TryParse.
- Поля пустые → добавьте проверки на пустую строку.
- Ошибки в UI после масштабирования → добавьте app.manifest с dpiAware или используйте метрики DPI.
- Исключения в рантайме при парсинге → всегда пользуйтесь TryParse и отлавливайте исключения.
Дополнительно: decision tree (выбор подхода)
flowchart TD
A[Нужно приложение для Windows] --> B{Нужен простой UI?}
B -- Да --> C[WinForms]
B -- Нет --> D{Нужна сложная графика или MVVM?}
D -- Да --> E[WPF]
D -- Нет --> F{Нужна кроссплатформенность?}
F -- Да --> G[MAUI / Web]
F -- Нет --> CКраткое резюме и дальнейшие шаги
Вы научились создавать проект Windows Forms, размещать элементы, обрабатывать событие кнопки и корректно парсить и форматировать числовые значения. Вы узнали, как запускать и отлаживать приложение, исправлять проблемы с DPI и как тестировать и развёртывать результат.
Дальше можно:
- Добавить юнит-тесты на вычисления.
- Реализовать историю вычислений и копирование результата.
- Изучить WPF для более сложных интерфейсов или MAUI для кроссплатформенных приложений.
Важно: при переносе приложения в продуктив обращайте внимание на локаль, формат чисел и настройки DPI. Маленькие утилиты, такие как наш конвертер, отлично подходят для изучения экосистемы .NET и наработки навыков GUI-разработки.
Похожие материалы
Отключить Windows Copilot в Windows 11
Включение Google Assistant: сделать Android похожим на Pixel
Dell SupportAssist OS Recovery — что это и как пользоваться
Удаление файлов и папок через CMD в Windows 10
PS4 Remote Play на Windows — настройка и советы