Визуальный дизайнер
Дизайнер NetForms — это расширение VS Code NetForms Designer (netforms.netforms-designer). Это
дизайнер Windows Forms из Visual Studio, заново сделанный для VS Code, на Windows и Linux. Правка форм
работает полностью без сети; создание проектов и форм использует шаблоны NetForms из NuGet.
Как поставить его и VS Code: Установка и настройка.

Как это устроено
*.Designer.csоткрывается холстом (Open as Text в заголовке редактора показывает код). F7 — переход вMainForm.cs, Shift+F7 — обратно.- Форму на холсте рисует сам NetForms: хост времени разработки (
tools/NetFormsDesigner.Host, входит в расширение) читаетInitializeComponent()через Roslyn без компиляции вашего проекта, строит живую форму и отдаёт картинку в webview. - Каждая правка записывается обратно в
*.Designer.csтак, как пишет Visual Studio (тот же порядок операторов, те же комментарии, те же правилаShouldSerialize— это сверяется с настоящим сериализатором WinForms в CI). Форма, сохранённая здесь, без изменений открывается в Visual Studio, и наоборот. Единственный источник истины — файл: правьте его как текст или переключайте ветки, холст перечитается. - Переименование контрола переименовывает поле, обработчики событий и их использования в вашем коде.
- Вкладка «События»: + рядом с событием пишет обработчик с именем по умолчанию (
button1_Click) вMainForm.csи открывает его — так же, как двойной щелчок по событию (или по контролу — для его события по умолчанию); ввод имени и Enter привязывают обработчик со своим именем. → — переход к обработчику, ✕ — отвязать (метод остаётся в коде, как в Visual Studio).
Создание проектов и форм
NetForms: Create New Project… и NetForms: New Form… (есть и в контекстном меню папки в проводнике)
запускают dotnet new с пакетом NetForms.Templates. В первый раз расширение ставит из NuGet ту версию
шаблонов, для которой оно сделано (dotnet new install NetForms.Templates::<версия>); новый проект ссылается на
пакет NetForms той же версии. Новая форма получает пространство имён проекта плюс папки, как в Visual Studio,
и открывается на холсте. Кроме пустой формы и пользовательского контрола есть готовые: диалоговое окно (ОК и
Отмена с DialogResult, AcceptButton/CancelButton, фиксированная рамка), окно «О программе» (продукт,
версия, авторские права и описание из атрибутов сборки), форма входа (имя и пароль) и заставка (окно без
рамки с названием, версией и индикатором). Из командной строки — dotnet new netforms-dialog,
netforms-aboutbox, netforms-login, netforms-splash.
Команды
| Команда | Клавиша | Что делает |
|---|---|---|
| NetForms: Open Visual Designer | Открывает *.Designer.cs (или форму текущего .cs) на холсте. |
|
| NetForms: Open as Text | Тот же файл в текстовом редакторе. | |
| NetForms: View Code | F7 | С холста в MainForm.cs. |
| NetForms: View Designer | Shift+F7 | Из MainForm.cs на холст. |
| NetForms: Tidy Designer File | Переписывает InitializeComponent() в каноническом виде, в котором его пишет дизайнер, убирая лишнее. |
|
| NetForms: Create New Project… | Новое приложение NetForms (см. выше). | |
| NetForms: New Form… | Форма (пустая, диалог, «О программе», вход, заставка) или пользовательский контрол в папке. | |
| NetForms: Convert WinForms Project… | Отчёт конвертера для .csproj, затем правка (Перевод WinForms-проекта). |
|
| NetForms: Run Project | dotnet run в терминале. |
|
| NetForms: Set as Startup Form | Application.Run в Program.cs запускает эту форму (контекстное меню *.Designer.cs и формы на холсте). |
|
| NetForms: Check for Updates… | Что устарело — одним списком с галочками: пакет NetForms в проектах рабочей области, шаблоны, это расширение (из выпуска на GitHub), .NET SDK (команда обновления вписывается в терминал, запускаете её вы: может понадобиться sudo). Раз в день проверяет и сама (netforms.checkForUpdates). |
|
| NetForms: Publish Application… | dotnet publish для Windows или Linux (x64, ARM64), автономно или с зависимостью от .NET, в publish/<rid> рядом с проектом. |
|
| NetForms: Add Control Library… | Элементы управления из пакета NuGet, .dll, локального .nupkg/фида, другого проекта, папки этого проекта или пакета, который проект уже подключает (Библиотеки элементов управления). Также в панели элементов и в контекстном меню .csproj в проводнике. |
|
| NetForms: Remove Control Library | Убирает группу библиотеки с панели элементов, а по желанию — и ссылку из .csproj. |
|
| NetForms: Rescan Toolbox | Собирает проект и заново читает его элементы управления и библиотеки (↻ на панели элементов). | |
| NetForms: Set Designer Host Path… | Использовать другой хост дизайнера. | |
| NetForms: Check Setup | Показывает найденные dotnet, хост дизайнера и шаблоны. |
Отладка (F5) — от расширения C#: его команда .NET: Generate Assets for Build and Debug создаёт launch.json.
Настройки
| Настройка | По умолчанию | |
|---|---|---|
netforms.dotnetPath |
dotnet |
Исполняемый файл dotnet, если его нет в PATH. |
netforms.designerHostPath |
пусто | Другой хост дизайнера (NetFormsDesigner.Host.dll); пусто — встроенный в расширение. |
netforms.checkForUpdates |
вкл. | Раз в день проверять, нет ли новее NetForms, расширения и .NET SDK, и сообщать об этом. |
netforms.snapToLines |
вкл. | Привязка к краям, центрам и отступам при перетаскивании (Alt — двигать свободно). |
Холст
Слева две вкладки: Элементы и Структура документа (Document Outline) — контролы формы деревом (в каждом контейнере — сначала передний, пункты полосы — под ней), как в Visual Studio. Щелчок выбирает; перетаскивание на контейнер кладёт контрол в него, выше или ниже другого контрола — ставит на это место среди соседей (z-порядок: порядок докинга, порядок FlowLayoutPanel).
Смарт-теги: стрелка ◂ в правом верхнем углу выбранного контрола открывает панель Задачи, как в Visual Studio, — самые нужные свойства (MultiLine у TextBox; источник данных и разрешения добавлять, править, удалять у таблицы; режим размера PictureBox; ориентация SplitContainer…), редакторы (Изменить пункты…, Изменить колонки…, Изменить узлы…) и команды: Заполнить родительский контейнер, Добавить/Удалить вкладку, Добавить колонку/строку, Встроить в ToolStripContainer (полосы — по его сторонам, прочие контролы — в середину) и у MenuStrip Вставить стандартные пункты (File, Edit, Tools, Help с сочетаниями клавиш; без картинок Visual Studio).
Перемещение и изменение размера мышью или стрелками (Ctrl — по 8, Shift — размер), линии привязки, выбор нескольких с Ctrl/Shift или рамкой (на форме; внутри панели или группы — когда она уже выбрана, и тогда она перемещается за значок ✥ в левом верхнем углу, как в Visual Studio; Ctrl/Shift добавляет к выбранному), Escape выбирает родителя, перенос в другой контейнер, Формат → Выровнять / Сделать одинаковыми / Интервалы, масштаб, блокировка, на передний / задний план, режим порядка обхода (щёлкайте по контролам по порядку). Докнутые контролы обведены пунктиром и тянутся только за свободную кромку, как в Visual Studio. Компоненты без места на форме (Timer, ToolTip, ImageList, меню, диалоги) попадают в лоток под формой. Отмена и повтор — Ctrl+Z / Ctrl+Y внутри холста.
Ctrl+C / Ctrl+X / Ctrl+V копируют, вырезают и вставляют контролы вместе со всем содержимым (дочерние контролы,
пункты меню, колонки, ячейки TableLayoutPanel), в том числе в другую форму; Ctrl+D дублирует рядом с оригиналом.
Вставленный контрол сохраняет имя, если оно свободно (иначе — button2), и обработчики событий, если вставлен в ту
же форму. Правый щелчок открывает контекстное меню, как в Visual Studio: перейти к коду, вырезать, копировать,
вставить, дублировать, удалить, передний/задний план, блокировка, выбрать родителя, свойства; у формы — «Сделать
стартовой формой».
TableLayoutPanel раскладывается по ячейкам, как в Visual Studio. Ячейки нарисованы пунктиром; контрол, брошенный
из панели элементов или перетащенный в таблицу, встаёт в ячейку под мышью (она подсвечивается), на занятую ячейку —
меняется местами с тем, кто в ней; стрелки двигают контрол по ячейкам; заполненная таблица растёт на строку (или
столбец — по GrowStyle). Границу между столбцами или строками можно тянуть мышью — меняется их размер. … у
Columns и Rows в окне свойств открывает редактор: тип размера каждого (Absolute — пиксели, Percent — доля
оставшегося места, AutoSize — по содержимому) и размер, вставка, удаление, перестановка; контролы едут вместе со
своими столбцами, а контролы удалённого столбца переезжают в свободные ячейки (вместе с ним не удаляются). Правый
щелчок в таблице — вставить или удалить столбец или строку под мышью. У контрола в таблице в окне свойств есть
Column, Row, ColumnSpan и RowSpan; каждый контрол таблицы, которую правил дизайнер, пишется как
Controls.Add(control, column, row).
Щелчок по заголовку вкладки TabControl показывает эту страницу — так раскладываются контролы на каждой вкладке
(выбор пишется в SelectedIndex, как в Visual Studio). … у TabPages, Items полосы меню или панели
инструментов, DropDownItems и Columns открывает редактор коллекции: элементы по их заголовкам, добавление,
удаление (страница — вместе с её контролами), перемещение вверх и вниз; - добавляет разделитель меню. У пунктов
полосы вид нового пункта выбирается рядом с ним — кнопка, надпись, раскрывающаяся или разделённая кнопка, разделитель,
поле со списком, текстовое поле, индикатор (что Visual Studio предлагает для этой полосы); «Изменить пункты…» /
«Изменить подпункты…» в контекстном меню открывает редактор.
Столбцы DataGridView и ListView (в режиме Details) выбираются щелчком по заголовку и правятся в окне свойств:
Width, DataPropertyName, ReadOnly, стиль ячеек и остальное; ColumnType превращает столбец DataGridView в
столбец флажков, списка, кнопок, картинок или ссылок с тем же именем и настройками. Сам DataGridView выбирается щелчком
по телу таблицы (или Escape на столбце).
FlowLayoutPanel раскладывается по порядку, а не по координатам: добавленный контрол встаёт в конец, брошенный или перетащенный в панель — туда, где показывает метка между контролами; перетаскивание внутри панели меняет порядок, а стрелки сдвигают выбранный контрол на одно место назад или вперёд.
Nodes у TreeView (…) открывают редактор узлов, как в Visual Studio: узлы деревом — Добавить корень,
Добавить дочерний, удалить, выше и ниже, наружу (соседом родителя) и внутрь (дочерним узлом выше) — и у выбранного
узла Text, Name, ImageKey, SelectedImageKey и StateImageKey (из ImageList дерева, с миниатюрами), Tag,
ToolTipText и Checked. Текстом… — правка текстов строками с отступами.
▾ рядом с Anchor, Dock, цветом или шрифтом открывает редактор как в Visual Studio: четыре планки вокруг
прямоугольника для Anchor, шесть мест для Dock, выбор цвета со вкладками Свои (палитра), Веб и Системные,
семейство, размер и стиль шрифта с образцом. Кнопка со своим цветом получает UseVisualStyleBackColor = false, как в
Visual Studio, — иначе цвет не виден.
Привязка данных задаётся в окне свойств, как в Visual Studio. DataSource (у BindingSource, DataGridView, ComboBox,
ListBox) предлагает источники привязки формы и классы проекта (его сборка загружается так же, как для своих
контролов, — сначала соберите проект): класс, выбранный для BindingSource, даёт DataSource = typeof(Customer); для
таблицы или списка — свой customerBindingSource (или тот, что на форме уже есть для этого класса), а таблица
получает по колонке на каждое свойство (nameDataGridViewTextBoxColumn, для bool — колонку флажков).
DisplayMember, ValueMember, DataMember и DataPropertyName колонки подсказывают свойства источника. Группа
(DataBindings) привязывает свойства контрола (Text, Tag, Checked, Value, SelectedValue…) к свойству
источника: customerBindingSource - Name пишет textBox1.DataBindings.Add(new Binding("Text", customerBindingSource, "Name", true)).
Сплиттер SplitContainer перетаскивается прямо на холсте, как в Visual Studio: за мышью идёт полоса, а
SplitterDistance ставится, когда кнопку отпустили (кроме IsSplitterFixed и свёрнутой панели).
ToolStripContainer редактируется как в Visual Studio: полосы (ToolStrip, MenuStrip, StatusStrip) кладутся в четыре
боковые панели, всё остальное — в середину (ContentPanel); если контейнер выбран, щелчок в панели элементов кладёт
полосу в верхнюю панель, а контрол — в середину. Полоса встаёт в тот ряд, на который её бросили, или в новый, если
бросить на полосу за последним рядом; её можно перетащить на другое место, в другой ряд или на другую сторону. В
дизайнере пустая верхняя панель держит 25 пикселей, чтобы было куда бросить, остальные и полоса за последним рядом — 8
(во время работы пустая панель места не занимает). Скрыть сторону — TopToolStripPanelVisible и соседние свойства.
Картинки и значки — Image, BackgroundImage, Icon формы, Image пункта меню — выбираются из файла кнопкой …
в окне свойств (✕ убирает; в гриде видна миниатюра) и хранятся в .resx формы, как у Visual Studio:
button1.Image = (Image)resources.GetObject("button1.Image"). Картинки ImageList (Images, …) добавляются из
файлов, переименовываются, переставляются и удаляются; ImageStream списка тоже уходит в .resx. Локализуемая форма
(Localizable = true) по-прежнему показывается, но не записывается (её свойства — в .resx по культурам).
Меню раскрываются на холсте, как в Visual Studio: щелчок по пункту меню показывает под ним его выпадающий список
(подменю — справа), а ContextMenuStrip, выбранный в лотке, раскрывается в левом верхнем углу формы. Любой пункт в
них можно выбрать — двойной щелчок пишет его обработчик Click, а ShortcutKeys, Checked, Image и собственные
DropDownItems задаются в окне свойств. Выбор чего-то другого закрывает меню.
ToolTip, HelpProvider, ErrorProvider и FlowLayoutPanel дают контролам свои свойства — в окне свойств они
подписаны именем поставщика: ToolTip on toolTip1, HelpString on helpProvider1, Error on errorProvider1, FlowBreak
on flowLayoutPanel1 — и пишутся как toolTip1.SetToolTip(button1, "...").
BindingNavigator, брошенный на форму, появляется со стандартными кнопками (первая, предыдущая, позиция, счётчик,
следующая, последняя, добавить, удалить) — каждая становится компонентом формы с именем как в Visual Studio
(bindingNavigatorMoveFirstItem, …); BindingSource задаётся в окне свойств. HelpProvider добавляет всем
контролам формы свойства HelpString, HelpKeyword, HelpNavigator и ShowHelp — так же, как ToolTip добавляет
ToolTip on toolTip1. Компоненты печати (группа Printing: PrintDocument, PrintDialog, PageSetupDialog,
PrintPreviewDialog) уходят в лоток, PrintPreviewControl ставится на форму.
Библиотеки элементов управления
По шагам — с проверкой, .vscode/netforms.json и тем, как написать свою библиотеку: Библиотеки элементов
управления в дизайнере.
На панели элементов есть собственные элементы управления проекта, как группа «Компоненты <Проект>» в Visual Studio: все открытые контролы, пользовательские контролы и компоненты проекта (не формы) из последней успешной сборки. После сборки — в терминале, по F5 или кнопкой ↻ на панели — дизайнер подхватывает их сам; контрол, добавленный после последней сборки, до следующей остаётся заглушкой с именем типа.
Другие библиотеки подключаются командой NetForms: Add Control Library… (кнопка + Библиотека элементов… на панели); само при открытии формы или перетаскивании ничего не ставится. Источники:
| Источник | Что меняется в проекте |
|---|---|
| Пакет NuGet | Поиск на nuget.org, выбор версии; пакет сначала скачивается и проверяется, затем dotnet add package. |
Файл .dll |
<Reference> с HintPath; файл копируется в libs/ проекта, чтобы проект собирался и на другой машине. |
.nupkg или локальный фид |
Папка становится источником пакетов в nuget.config проекта, дальше — как пакет NuGet. |
| Папка этого проекта | Ничего: контролы этой папки (её пространства имён) получают свою группу на панели. |
| Другой проект | dotnet add reference; его контролы обновляются после каждой его сборки. |
| Пакет NuGet, уже подключённый к проекту | Ничего: вы отмечаете, какие пакеты показывать. |
Перед добавлением сборки библиотеки читаются без выполнения её кода: собрана под NetForms — добавляется; под
настоящий System.Windows.Forms — предупреждение (проект может не собраться на Linux); нативные части только для
Windows — предупреждение; собрана под .NET Framework или без фреймворка, совместимого с .NET 10, — не добавляется, с
объяснением. Затем показываются найденные контролы и компоненты с иконками из [ToolboxBitmap]; снимите галочки с
лишних.
Ссылки хранятся в .csproj, группы панели элементов — в .vscode/netforms.json (закоммитьте его — и у коллег
панель будет той же). Библиотека, ссылка на которую пропала из .csproj, скрывается, а не ломает дизайнер. Добавленные
раньше библиотеки предлагаются первыми в следующем проекте.
Код библиотеки выполняется в хосте дизайнера, как и в Visual Studio. В папке, которой вы не доверились (ограниченный
режим), панель перечисляет контролы только по метаданным: их код не загружается, добавить ничего нельзя. Контрол, у
которого бросает исключение конструктор или OnPaint, рисуется красным крестом с текстом ошибки — форма всё равно
открывается, и из неё ничего не теряется. Сборки загружаются из копии, поэтому следующая сборка не упрётся в занятую .dll.
Пока нет
- Правки формы с
Localizable = true(такие формы открываются только для чтения с объяснением). - Редактора темы.
- Дизайн-тайм-дополнений сторонних библиотек: их собственных дизайнеров (
[Designer], смарт-теги) иUITypeEditor. ИхTypeConverterработают. Как загружаются библиотеки — designer-control-libraries.md.
Язык
Интерфейс следует языку VS Code: английский или русский. Группы панели элементов и категории свойств названы как в русской Visual Studio; описания свойств берутся из WinForms и остаются на английском.