Справочник по WinForms — элементы UI
Пошаговые рецепты Windows Forms на C#. Обзор платформы — Windows Forms (WinForms); первая форма — там же. Готовые мини-приложения с разбором каждой строки — C# WinForms и WPF — простые окна (калькулятор, конвертер, список задач); на Java (Swing) — Lab — 1143. Имена элементов — Архитектура десктопных приложений; UI-поток — Особенности разработки десктопных приложений. Язык C# — раздел C#.
Примеры — кодом (без Designer); те же контролы можно перетаскивать из Toolbox в Visual Studio. Для учебных проектов удобно начать с галереи Lab, затем уточнять API по разделам ниже.
Как пользоваться
- Создайте форму
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 — однострочный
Код ITЗагрузка примера кода…
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 / висящие потоки |
См. также
- C# WinForms и WPF — простые окна (Lab)
- Java Swing — окна и кнопки (Lab)
- Windows Forms (WinForms)
- WPF — первая программа · элементы UI
- Разработка для Windows
- Архитектура десктопа · Особенности разработки десктопных приложений
- Платформа .NET — UI-фреймворки