Перейти к основному содержимому

Windows Forms (WinForms)

Разработчику Архитектору Инженеру

Windows Forms (WinForms)

Где применяют WinForms

Windows Forms — платформа пользовательского интерфейса для создания классических настольных приложений Windows на .NET. Это один из самых продуктивных способов собрать десктоп с визуальным конструктором в Visual Studio: контролы перетаскиваются на форму, свойства редактируются в окне Properties, а логика пишется в обработчиках событий.

Официальная документация: Windows Forms для .NET. Платформа Windows в целом (WinUI, SDK, Store): Разработка приложений для Windows. Сравнение с WPF, MAUI и другими стеками: Особенности разработки десктопных приложений. Подробнее о WinForms в экосистеме .NET: Платформа .NET — UI-фреймворки.


WinForms - формы, контролы и конструктор в Visual Studio

По обзору Microsoft Learn:

  • WinForms — технология UI для .NET: набор управляемых библиотек для типовых задач (файлы, сеть, диалоги) и построения интеллектуальных клиентских приложений Windows.
  • Платформа поддерживает элементы управления, графику (System.Drawing), привязку данных и ввод пользователя (клавиатура, мышь, перетаскивание).
  • Приложения могут работать автономно и в сети, обращаться к локальному оборудованию и файловой системе в рамках прав ОС.
  • Характерная черта — конструктор форм в Visual Studio с drag-and-drop, сеткой и линиями привязки для выравнивания контролов.

WinForms появился в .NET Framework 1.0 (2002); с .NET Core 3.0 и далее платформа перенесена в современный .NET (сейчас актуальны ветки вроде .NET 8/9/10). Подходит для внутренних утилит, сопровождения legacy, быстрых CRUD-интерфейсов и систем, где важны простота и интеграция с Windows, а не «богатый» кастомный UI.


Две реализации

Microsoft различает две линии WinForms (обзор):

РеализацияСредаПримечание
WinForms для .NETnet8.0-windows, net9.0-windows и новееОткрытый исходный код на GitHub — dotnet/winforms; развивается вместе с релизами .NET
WinForms .NET Framework 4.xnet48 и нижеВходит в Windows как компонент .NET Framework; поддержка в Visual Studio 2017–2022

Для новых проектов выбирают SDK-шаблон Windows Forms и целевой фреймворк net*-windows. Миграция с .NET Framework описана в руководстве по переходу.


Модель приложения — форма, контролы, события

Форма

В WinForms форма (System.Windows.Forms.Form) — визуальная поверхность окна или диалога: заголовок, границы, кнопки свернуть/развернуть, область для контролов. Класс Form позволяет создавать обычные, модальные, MDI-окна и настраивать FormBorderStyle, StartPosition, Size, Text и др. (документация Form).

Типичное приложение:

  1. Создаётся одна или несколько форм.
  2. На форму добавляются элементы управления (Control и наследники).
  3. На действия пользователя подписываются обработчики событий (клик, ввод текста, закрытие формы).

Подробнее: События в Windows Forms.

Контролы

Стандартные контролы: Button, TextBox, Label, ComboBox, CheckBox, RadioButton, ListBox, TreeView, TabControl, встроенный WebBrowser / современные варианты через WebView2 и др. Полный список: элементы управления для Windows Forms.

Для сложного UI без сторонних библиотек используют:

Отрисовка «вручную» — через System.Drawing (линии, фигуры, owner-draw).

Событийная модель

Любое действие пользователя с формой или контролом порождает событие; приложение реагирует кодом в момент возникновения. Это та же идея, что перенесли в ASP.NET Web Forms (PostBack, ViewState) — см. C# — Web Forms.

Поток UI
WinForms использует STA-поток и цикл сообщений Windows. Обновление контролов из фонового потока — только через Control.Invoke / BeginInvoke. См. раздел о многопоточности в 112.md.


Разработка в Visual Studio

Рекомендуемый путь — создание приложения WinForms в Visual Studio:

  1. Шаблон «Приложение Windows Forms» (.NET).
  2. Конструктор форм — перетаскивание с Toolbox, свойства в Properties, автогенерация *.Designer.cs и InitializeComponent().
  3. Окно «Источники данных» — drag-and-drop привязки к БД, XML, JSON, веб-сервисам.

Минимальная структура точки входа (.NET 6+):

namespace MyWinFormsApp;

static class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}

Файл проекта обычно использует SDK Microsoft.NET.Sdk с UseWindowsForms:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

Скачать среду: Visual Studio 2022 с рабочей нагрузкой «Разработка классических приложений .NET».


Карта документации Microsoft Learn

Ниже — структура главной страницы WinForms в сжатом виде (удобно как оглавление для углубления).

Сведения и старт

ТемаСсылка
Обзорoverview
Что нового (.NET 10 и др.)whats-new
Создание приложенияcreate-app-visual-studio
Миграция с .NET Frameworkmigration

Элементы управления

ТемаСсылка
Обзор контроловcontrols overview
Список контроловcontrols-to-use
Добавление контролаadd control
Горячие клавиши (access keys)access keys

Ввод — клавиатура и мышь

ТемаСсылка
Клавиатураinput-keyboard
События клавиатурыkeyboard events
Мышьinput-mouse
Перетаскивание (drag-and-drop)drag-and-drop

Привязка данных и параметры

ТемаСсылка
DataGridViewdata grid
BindingSource, BindingNavigatordata binding
Параметры приложенияapplication settings

Развёртывание и сопровождение

ТемаСсылка
Развёртываниеdeployment
Обновления ClickOnce / MSIXсм. разделы deployment на Learn
Устранение неполадокtroubleshooting

Архитектура и ограничения

  • Каждый стандартный контрол — обёртка над HWND (User32): нативный вид, высокая совместимость с Windows, но внешний вид зависит от темы ОС.
  • Графика «из коробки» — GDI+, не DirectX: сложные эффекты (анимации, векторный UI) проще в WPF или MAUI.
  • Контролы не маршалируются между доменами приложений (AppDomain); multi-AppDomain-сценарии с передачей контролов через границы не поддерживаются.
  • Официальная платформа — Windows; кроссплатформенность ограничена (Mono и аналоги — не целевой путь Microsoft).

Паттерны: код «в форме», MVP (удобно тестировать UI-логику), реже MVVM. См. архитектурные паттерны в этом же разделе.


Актуальное развитие (.NET 10+)

Платформа не заморожена: в новых возможностях WinForms для .NET 10 среди прочего:

  • унификация API буфера обмена с WPF;
  • улучшения асинхронных форм и отзывчивости UI при нескольких окнах.

Сообщество дополняет экосистему через Windows Forms Community Toolkit.


Когда выбирать WinForms

Выбирайте WinFormsРассмотрите WPF / MAUI / Electron
Быстрый UI под Windows, знакомая событийная модельБогатый кастомный дизайн, анимации, MVVM
Сопровождение существующего .NET Framework-приложенияКроссплатформа macOS/Linux
Внутренние утилиты, админки, линейные формыUI на HTML/CSS (команда веб-разработчиков)

Частые ошибки

СимптомПричина
«Зависание» формыДолгая работа в обработчике Click
Cross-thread operation not validОбновление контрола не из UI-потока — Invoke
Дизайнер не открываетсяОшибка в InitializeComponent / partial class
DPI размытиеНет AutoScaleMode / PerMonitorV2 в манифесте

Что попробовать

  1. async void обработчик + await Task.Run для тяжёлой работы.
  2. BindingSource + DataGridView — мини-CRUD без ручного refresh.
  3. Встроить WebView2 на форму для гибридного UI.

Частые ошибки

СимптомПричина
«Зависание» формыДолгая работа в обработчике Click
Cross-thread operation not validОбновление контрола не из UI-потока — Invoke
Дизайнер не открываетсяОшибка в InitializeComponent / partial class
DPI размытиеНет AutoScaleMode / PerMonitorV2 в манифесте

Что попробовать

  1. async void обработчик + await Task.Run для тяжёлой работы.
  2. BindingSource + DataGridView — мини-CRUD без ручного refresh.
  3. Встроить WebView2 на форму для гибридного UI.

См. также


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).