Введение

Библиотека программного обеспечения графического пользовательского интерфейса Windows Forms (WinForms) — это бесплатная библиотека графических классов (GUI) с открытым исходным кодом, входящая в состав Microsoft .NET, .NET Framework или Mono, предоставляющая платформу для разработки клиентских приложений для настольных компьютеров, ноутбуков и планшетных ПК. Хотя её рассматривают как замену более ранней и сложной библиотеки классов Microsoft Foundation, основанной на C++, она не предлагает аналогичную парадигму и служит лишь платформой для уровня пользовательского интерфейса в многоуровневом решении. 4 декабря 2018 года на мероприятии Microsoft Connect компания Microsoft объявила о публикации Windows Forms как проекта с открытым исходным кодом на GitHub под лицензией MIT. Благодаря этому Windows Forms стала доступна для проектов, ориентированных на .NET Core. Однако, фреймворк по-прежнему доступен только на платформе Windows, а неполная реализация Windows Forms в Mono остаётся единственной кроссплатформенной реализацией.

Архитектура

Приложение Windows Forms — это приложение, управляемое событиями, поддерживаемое платформой Microsoft .NET Framework. В отличие от пакетной программы, оно большую часть времени проводит в ожидании действий пользователя, таких как ввод текста в поле или нажатие кнопки. Код приложения может быть написан на любом языке программирования .NET, например, на C# или Visual Basic. Windows Forms обеспечивает доступ к стандартным элементам управления пользовательского интерфейса Windows, оборачивая существующий API Windows в управляемый код. Благодаря Windows Forms платформа .NET Framework предоставляет более полную абстракцию над Win32 API, чем Visual Basic или MFC. Windows Forms аналогична библиотеке Microsoft Foundation Class (MFC) при разработке клиентских приложений. Она предоставляет обертку, состоящую из набора классов C++ для разработки приложений Windows. Однако, в отличие от MFC, она не предоставляет встроенной структуры приложения. Каждый элемент управления в приложении Windows Forms является конкретным экземпляром класса.

Особенности

Все визуальные элементы в библиотеке классов Windows Forms наследуются от класса Control. Это обеспечивает минимальную функциональность элемента пользовательского интерфейса, такую как положение, размер, цвет, шрифт, текст, а также общие события, такие как щелчок и перетаскивание. Класс Control также поддерживает привязку, позволяющую элементу управления изменять свое положение относительно родительского элемента. Поддержка Microsoft Active Accessibility в классе Control также помогает пользователям с ограниченными возможностями более эффективно использовать Windows Forms. В Visual Studio формы создаются с помощью перетаскивания. Инструмент позволяет размещать элементы управления (например, текстовые поля, кнопки и т. д.) на форме (окне). Элементы управления имеют атрибуты и связанные с ними обработчики событий. При создании элемента управления предоставляются значения по умолчанию, которые могут быть изменены программистом. Многие значения атрибутов могут быть изменены во время выполнения на основе действий пользователя или изменений в среде, что обеспечивает динамическое поведение приложения. Например, код может быть добавлен в обработчик события изменения размера формы, чтобы переместить элемент управления так, чтобы он оставался центрированным, расширялся для заполнения формы и т. п. Вставляя код в обработчик события нажатия клавиши в текстовом поле, программа может автоматически изменять регистр вводимого текста или даже предотвращать ввод определенных символов. Помимо обеспечения доступа к нативным элементам управления Windows, таким как кнопка, текстовое поле, флажок и список, Windows Forms добавила собственные элементы управления для размещения ActiveX, организации макета, проверки и привязки данных. Эти элементы управления отрисовываются с использованием GDI+. Некоторые методы позволяют получить прямой доступ к функциям обратного вызова Win32, которые недоступны на платформах, отличных от Windows. С выпуском .NET Framework 3.0 Microsoft представила второй, параллельный API для отрисовки графических интерфейсов: Windows Presentation Foundation (WPF), основанный на DirectX, вместе с декларативным языком описания графического интерфейса XAML. Во время сессии вопросов и ответов на конференции Build 2014 Microsoft сообщила, что Windows Forms находится в режиме обслуживания, новые функции не добавляются, но обнаруженные ошибки будут исправляться. В последних обновлениях .NET Framework версии 4.5 была реализована улучшенная поддержка высокого DPI для различных элементов управления Windows Forms.

Обратная совместимость XAML с Windows Forms

Для дальнейшей разработки Microsoft заменила Windows Forms графическим интерфейсом на основе XAML, используя такие фреймворки, как WPF и UWP. Однако возможность перетаскивания элементов графического интерфейса, аналогичная Windows Forms, в XAML сохранена путем замены корневого XAML-элемента страницы/окна элементом управления "Canvas". При этом пользователь может создавать окна подобно Windows Forms, непосредственно перетаскивая компоненты в графическом интерфейсе Visual Studio. Хотя XAML обеспечивает обратную совместимость с перетаскиванием через элемент управления Canvas, элементы управления XAML лишь похожи на элементы управления Windows Forms и не являются полностью совместимыми. Они выполняют аналогичные функции и имеют схожий внешний вид, но их свойства и методы достаточно отличаются, что требует преобразования при переходе от одного API к другому.

Альтернативное осуществление

Mono — проект, возглавляемый Xamarin (ранее Ximian, затем Novell), для создания набора инструментов, совместимых с .NET Framework и соответствующих стандарту Ecma. В 2011 году было объявлено о завершении поддержки System.Windows.Forms на уровне .NET 2.0; System.Windows.Forms 2.0 работает непосредственно на Mac OS X. Однако, System.Windows.Forms не активно разрабатывалась в Mono. Достичь полной совместимости с .NET оказалось невозможно, поскольку Microsoft System.Windows Forms является, в основном, оберткой над API Windows, а некоторые из её методов предоставляют прямой доступ к Win32-функциям обратного вызова, которые недоступны на платформах, отличных от Windows. Mono был обновлен таким образом, что по умолчанию предполагает 64-битную платформу. Тем не менее, System.Windows.Forms в Mono для платформы Macintosh OS X была реализована с использованием 32-битной подсистемы Carbon. На сегодняшний день 64-битная версия System.Windows.Forms для использования на Mac OS X остается недоступной, и только .NET-приложения, скомпилированные для 32-битной платформы, могут быть запущены.