Гид по технологиям

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

8 min read Разработка Обновлено 13 Dec 2025
WinForms: конвертер Цельсий → Фаренгейт — шаг за шагом
WinForms: конвертер Цельсий → Фаренгейт — шаг за шагом

Компьютер на столе с открытым кодом

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

  1. Откройте Visual Studio и выберите Создать новый проект.
  2. В списке шаблонов найдите Windows Form App (или Windows Forms App) и выберите его.

Выбор шаблона Windows Forms в списке проектов

Если опция отсутствует, откройте Visual Studio Installer и добавьте рабочую нагрузку .NET desktop development (Разработка рабочих столов .NET).

  1. Укажите имя проекта и папку для хранения файлов.

  2. На следующем экране для примера выберите .NET Core 3.1 (можно выбрать и более новые версии, см. раздел совместимости).

  3. Нажмите Создать.

Настройка проекта Windows Forms

После создания проект откроется в среде разработки, и вы увидите форму (canvas) — белое рабочее пространство для размещения элементов.

Окно Visual Studio с холстом дизайнера

Как добавить элементы на форму

Холст — это пространство, где вы размещаете элементы интерфейса. Изменяйте размер холста перетаскиванием за маркеры по краям.

  1. Откройте меню View и выберите Toolbox (Панель элементов).

Открытие вкладки View для отображения панели инструментов

  1. На панели элементов найдите кнопку, метки (Label) и текстовые поля (TextBox). Закрепите панель, если хотите, щёлкнув по иконке закрепления.

  2. Перетащите на форму одну кнопку, три метки и два текстовых поля.

Перетаскивание элемента на холст дизайнера Visual Studio

  1. Расположите элементы так, чтобы интерфейс выглядел понятно: заголовок, поле ввода для Цельсия, поле для Фаренгейта и кнопка «Вычислить».

Форма с тремя метками, двумя текстовыми полями и кнопкой

  1. Выделите элемент и откройте окно Properties (Свойства), чтобы установить текст, имя, размер шрифта и другие параметры.

  2. Пример свойств для компонентов (переведено и локализовано):

ЭлементСвойствоНовое значение
label1TextCelsius to Fahrenheit
label1Font.Size22pt
label2TextCelsius
label3TextFahrenheit
button1TextCalculate
fahrenheitTextBoxReadOnlyTrue

Вместо label1/label2 можно использовать понятные имена.

Изменение свойств элементов в Visual Studio

Совет: держите текст элементов коротким и понятным. Для локализации учитывайте десятичный разделитель и формат чисел.

Связывание событий и написание кода (Code-Behind)

Событие — это действие пользователя (клик, ввод, выбор). Для кнопки обычно обрабатывают событие Click.

C# — основной язык для разработки WinForms. Если вы не знакомы с C#, изучите основы: типы данных, методы, исключения.

  1. Дважды кликните на кнопку Calculate в дизайнере. Visual Studio автоматически создаст метод обработчика в Form1.cs с подписью:
private void calculateButton_Click(object sender, EventArgs e)
{
    // сюда добавим код
}
  1. Дайте понятные имена текстовым полям в свойствах: celsiusTextBox и fahrenheitTextBox.

  2. Пример реалистичного и безопасного кода с проверкой ввода:

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 (Запуск) на панели инструментов.

Запуск приложения WinForms зелёной кнопкой

В появившемся окне формы введите значение в поле Цельсия и нажмите Calculate. Результат появится в поле Фаренгейта.

Работающая WinForms-программа

DPI и размытие на HiDPI-экранах

Если приложение выглядит размытым, оно может не быть DPI-aware. Для корректного масштабирования в современных дисплеях добавьте манифест приложения:

  1. В обозревателе решений правой кнопкой по проекту TemperatureConverter → Add → New Item.
  2. Выберите Application Manifest File (app.manifest) и добавьте его.

Выбор файла манифеста в Visual Studio

Внутри app.manifest включите установки DPI, например:


  
    true
    true
  

После изменения остановите отладку и запустите приложение снова.

Отладка с помощью точек останова

Чтобы найти ошибку в логике:

  1. Откройте Form1.cs и найдите метод calculateButton_Click.
  2. Кликните на серую область слева от строки — появится красный круг (breakpoint).
  3. Запустите приложение и нажмите кнопку Calculate. Выполнение остановится на точке останова, и вы сможете просмотреть значения переменных.
  4. Чтобы продолжить, нажмите Continue (F5).

Добавление точки останова для начала отладки

Как запустить программу без Visual Studio

Сборка генерирует исполняемый файл. Путь по умолчанию (Debug):

/bin/Debug/netcoreapp3.1/TemperatureConverter.exe

Найдите исполняемый файл и запустите его двойным кликом.

Расширение функционала и устойчивость приложения

Ниже собраны рекомендации и готовые шаблоны для улучшения приложения, тестирования и ввода в продакшен.

Валидация ввода и 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) приложение корректно парсит и вычисляет результат в текущей локали.
  • При пустом или неверном вводе приложение показывает понятное сообщение об ошибке и не падает.

Тест-кейсы (мини):

  1. Ввод: 0 → ожидаемый результат: 32
  2. Ввод: 100 → ожидаемый результат: 212
  3. Ввод: -40 → ожидаемый результат: -40
  4. Ввод: “abc” → ожидается сообщение об ошибке
  5. Ввод: “36,6” в локали с запятой → ожидаемый числовой результат
  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 дисплеях.

Дизайнер — чек-лист

  • Контраст текста и фона соответствует требованиям доступности.
  • Размеры шрифтов читаемы на типичных экранах.
  • Кнопки и поля достаточно большие для удобства взаимодействия.

Мини-методология разработки (быстрая)

  1. Спроектируйте UI на бумаге.
  2. Разместите элементы на форме и присвойте имена.
  3. Напишите обработчик события кнопки с валидацией.
  4. Добавьте юнит-тесты и ручное тестирование.
  5. Проведите тесты на разных локалях и DPI.
  6. Подготовьте манифест и соберите релиз.

Рекомендации по развёртыванию

  • Соберите релизную конфигурацию (Release).
  • Для простого распространения можно скопировать папку с exe и зависимостями.
  • Для крупных проектов используйте установщики (MSIX, Inno Setup) или ClickOnce.

Частые ошибки и способы их устранения

  1. Приложение не парсит число с запятой → используйте CultureInfo и TryParse.
  2. Поля пустые → добавьте проверки на пустую строку.
  3. Ошибки в UI после масштабирования → добавьте app.manifest с dpiAware или используйте метрики DPI.
  4. Исключения в рантайме при парсинге → всегда пользуйтесь 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-разработки.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Отключить Windows Copilot в Windows 11
Windows

Отключить Windows Copilot в Windows 11

Включение Google Assistant: сделать Android похожим на Pixel
Android.

Включение Google Assistant: сделать Android похожим на Pixel

Dell SupportAssist OS Recovery — что это и как пользоваться
Руководство

Dell SupportAssist OS Recovery — что это и как пользоваться

Удаление файлов и папок через CMD в Windows 10
Windows 10

Удаление файлов и папок через CMD в Windows 10

PS4 Remote Play на Windows — настройка и советы
Гайды

PS4 Remote Play на Windows — настройка и советы

Тренировка подсознания с помощью сублиминалов
Саморазвитие

Тренировка подсознания с помощью сублиминалов