Справочник по WinForms — элементы UI
Назначение
Пошаговые рецепты Windows Forms на C#. Обзор платформы — 115.md; первая форма — там же. Имена элементов — Архитектура десктопных приложений; UI-поток — 112.md. Язык C# — раздел C#.
Примеры — кодом (без Designer); те же контролы можно перетаскивать из Toolbox в Visual Studio.
Как пользоваться
- Создайте форму
Formи контейнерPanelилиTableLayoutPanel. - Добавьте контрол:
Controls.Add(control)или в ячейку layout. - Подпишите обработчик:
control.Click += OnClick;или двойной клик по контролу в Designer.
UI обновляйте из UI-потока; из фона — control.Invoke(() => { ... }).
Главное окно (Form)
using System;
using System.Windows.Forms;
ApplicationConfiguration.Initialize();
var form = new Form
{
Text = "Моё приложение",
ClientSize = new Size(640, 480),
StartPosition = FormStartPosition.CenterScreen
};
Application.Run(form);
Program.cs (.NET 6+):
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new MainForm());
}
.csproj: <UseWindowsForms>true</UseWindowsForms>, <TargetFramework>net8.0-windows</TargetFramework>.
Контейнер (Panel / TableLayoutPanel)
var panel = new Panel { Dock = DockStyle.Fill, Padding = new Padding(12) };
form.Controls.Add(panel);
var table = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 2,
RowCount = 4,
AutoSize = true
};
table.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
table.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100f));
panel.Controls.Add(table);
Label (метка)
var label = new Label
{
Text = "Имя пользователя:",
AutoSize = true,
Anchor = AnchorStyles.Left
};
table.Controls.Add(label, 0, 0);
label.Text = "Обновлено";
TextBox — однострочный
var textBox = new TextBox
{
Width = 240,
PlaceholderText = "Введите имя" // .NET 6+
};
table.Controls.Add(textBox, 1, 0);
string value = textBox.Text.Trim();
textBox.Clear();
textBox.Text = "по умолчанию";
textBox.KeyDown += (s, e) =>
{
if (e.KeyCode == Keys.Enter) Submit();
};
TextBox — многострочный
var notes = new TextBox
{
Multiline = true,
ScrollBars = ScrollBars.Vertical,
Height = 120,
Dock = DockStyle.Fill,
WordWrap = true
};
panel.Controls.Add(notes);
string text = notes.Text;
Поле пароля
var password = new TextBox
{
UseSystemPasswordChar = true,
Width = 200
};
// или MaskedTextBox с маской
Button (кнопка)
var save = new Button
{
Text = "Сохранить",
AutoSize = true,
DialogResult = DialogResult.None
};
save.Click += (s, e) => OnSave();
table.Controls.Add(save, 1, 3);
var ok = new Button { Text = "OK", DialogResult = DialogResult.OK };
CheckBox (флажок)
var notify = new CheckBox
{
Text = "Уведомления",
Checked = true,
AutoSize = true
};
notify.CheckedChanged += (s, e) => Console.WriteLine(notify.Checked);
bool on = notify.Checked;
RadioButton (переключатель)
var user = new RadioButton { Text = "Пользователь", Checked = true, AutoSize = true };
var admin = new RadioButton { Text = "Админ", AutoSize = true };
var panelRoles = new FlowLayoutPanel { FlowDirection = FlowDirection.TopDown };
panelRoles.Controls.AddRange(new Control[] { user, admin });
ComboBox (выпадающий список)
var combo = new ComboBox
{
DropDownStyle = ComboBoxStyle.DropDownList,
Width = 180
};
combo.Items.AddRange(new object[] { "Работа", "Личное", "Учёба" });
combo.SelectedIndex = 0;
string choice = combo.SelectedItem?.ToString() ?? "";
table.Controls.Add(combo, 1, 1);
ListBox (список)
var list = new ListBox { Height = 120, Dock = DockStyle.Fill };
list.Items.AddRange(new object[] { "Яблоко", "Груша", "Слива" });
list.SelectedIndexChanged += (s, e) =>
{
if (list.SelectedItem is string item) Console.WriteLine(item);
};
panel.Controls.Add(list);
DataGrid (DataGridView)
var grid = new DataGridView
{
Dock = DockStyle.Fill,
AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill,
ReadOnly = true,
AllowUserToAddRows = false
};
grid.Columns.Add("name", "Имя");
grid.Columns.Add("age", "Возраст");
grid.Rows.Add("Алиса", 30);
panel.Controls.Add(grid);
С BindingSource / списком объектов — привязка DataSource.
ProgressBar (индикатор прогресса)
var progress = new ProgressBar
{
Minimum = 0,
Maximum = 100,
Value = 0,
Style = ProgressBarStyle.Continuous,
Width = 240
};
progress.Value = 50;
var marquee = new ProgressBar { Style = ProgressBarStyle.Marquee, MarqueeAnimationSpeed = 30 };
TrackBar (ползунок)
var track = new TrackBar
{
Minimum = 0,
Maximum = 100,
Value = 50,
TickFrequency = 10,
Width = 240
};
track.ValueChanged += (s, e) => label.Text = track.Value.ToString();
Поле поиска (фильтр ListBox)
var search = new TextBox { PlaceholderText = "Поиск…" };
search.TextChanged += (s, e) =>
{
list.Items.Clear();
foreach (var item in allItems)
if (item.Contains(search.Text, StringComparison.OrdinalIgnoreCase))
list.Items.Add(item);
};
TabControl (вкладки)
var tabs = new TabControl { Dock = DockStyle.Fill };
var tabGeneral = new TabPage("Общее");
tabGeneral.Controls.Add(new Label { Text = "Содержимое", Dock = DockStyle.Fill });
var tabSettings = new TabPage("Настройки");
tabs.TabPages.Add(tabGeneral);
tabs.TabPages.Add(tabSettings);
form.Controls.Add(tabs);
MenuStrip (меню)
var menu = new MenuStrip();
var file = new ToolStripMenuItem("Файл");
file.DropDownItems.Add("Открыть", null, (s, e) => OpenFile());
file.DropDownItems.Add(new ToolStripSeparator());
file.DropDownItems.Add("Выход", null, (s, e) => form.Close());
menu.Items.Add(file);
form.MainMenuStrip = menu;
form.Controls.Add(menu);
ToolStrip (панель инструментов)
var tool = new ToolStrip();
tool.Items.Add(new ToolStripButton("Новый", null, (s, e) => NewDoc()));
tool.Items.Add(new ToolStripButton("Сохранить", null, (s, e) => SaveDoc()));
form.Controls.Add(tool);
StatusStrip (строка состояния)
var status = new StatusStrip();
var label = new ToolStripStatusLabel("Готово") { Spring = true, TextAlign = ContentAlignment.MiddleLeft };
status.Items.Add(label);
form.Controls.Add(status);
label.Text = "Сохранено";
Прокрутка (Panel + AutoScroll)
var scroll = new Panel
{
Dock = DockStyle.Fill,
AutoScroll = true
};
scroll.Controls.Add(tallContent);
form.Controls.Add(scroll);
Для TextBox/ListBox — встроенные ScrollBars.
Диалоги
MessageBox.Show("Готово", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
var ok = MessageBox.Show("Удалить?", "Подтверждение", MessageBoxButtons.YesNo) == DialogResult.Yes;
using var ofd = new OpenFileDialog { Filter = "Текст|*.txt|Все|*.*" };
if (ofd.ShowDialog() == DialogResult.OK) { var path = ofd.FileName; }
using var sfd = new SaveFileDialog { DefaultExt = "txt" };
if (sfd.ShowDialog() == DialogResult.OK) { /* сохранить */ }
using var fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK) { var dir = fbd.SelectedPath; }
ToolTip (подсказка)
var tips = new ToolTip();
tips.SetToolTip(saveButton, "Сохранить документ на диск");
tips.ShowAlways = true;
ContextMenuStrip (контекстное меню)
var menu = new ContextMenuStrip();
menu.Items.Add("Копировать", null, (s, e) => Copy());
menu.Items.Add("Вставить", null, (s, e) => Paste());
listBox.ContextMenuStrip = menu;
Дочерняя форма (модальная)
using var dialog = new Form
{
Text = "Настройки",
ClientSize = new Size(320, 200),
FormBorderStyle = FormBorderStyle.FixedDialog,
StartPosition = FormStartPosition.CenterParent,
MaximizeBox = false,
MinimizeBox = false
};
dialog.ShowDialog(ownerForm);
Фоновая работа без блокировки UI
await Task.Run(() => LongWork());
label.Text = "Готово"; // после await — уже в UI-потоке
// или
button.Invoke(() => button.Enabled = false);
Частые ошибки
| Симптом | Причина |
|---|---|
| Контрол не виден | Нет Controls.Add, нулевой Size, перекрыт Dock |
| UI зависает | Долгий код в обработчике Click |
| Cross-thread | Обновление контрола не через Invoke |
| Форма не закрывает процесс | Нет Application.Exit / висящие потоки |
См. также
- Windows Forms (WinForms)
- WPF — первая программа · элементы UI
- Разработка для Windows
- Архитектура десктопа · 112.md
- Платформа .NET — UI-фреймворки
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Настоятельно рекомендую ознакомиться со главой, посвящённой созданию десктопных приложений на Python - 5.02. Графика и игры. Десктопное приложение — это композитная сущность, объединяющая код, ресурсы, метаданные, конфигурации и, зачастую, механизмы обновления, диагностики и интеграции с другими компонентами системы. Многопоточность, реактивность, ресурсы, отладка и прочее. WebView - встроенный браузер в приложениях. Electron — десктопные приложения на HTML, CSS и JavaScript с процессами main, preload и renderer. Windows Forms — платформа GUI для классических настольных приложений Windows на .NET; формы, контролы, события, привязка данных и визуальный конструктор Visual Studio. Платформа разработчика Windows — Windows SDK, Windows App SDK, WinUI 3, WPF, среда разработки, поддержка и обзор драйверов по документации Microsoft. Учётная запись разработчика, MSIX, Partner Center, сертификация и распространение приложений для Windows через Microsoft Store. Десктопное окно — Electron, Vite, React и безопасный IPC через preload; пошаговый разбор для новичков. Пошаговая сборка WPF-приложения с нуля — разметка XAML, привязка данных, Style, DataTemplate и ControlTemplate на примере списка заметок. Рецепты WPF — Window, Label, Button, TextBox, привязки, списки, меню в XAML и C#. Работа с графовыми структурами в коде - визуализация состояний узлов и отладка обходов графа на практике.Архитектура десктопных приложений
Разработка приложений для настольных операционных систем
Особенности разработки десктопных приложений
WebView
Electron
Windows Forms (WinForms)
Разработка приложений для Windows (Microsoft Learn)
Microsoft Store и публикация Windows-приложений
Первая программа Electron с React
Первая форма WPF — XAML, стили и шаблоны
Справочник по WPF — элементы UI
Работа с графовыми структурами в коде