Windows Forms ( WinForms ) — это бесплатная и открытая графическая (GUI) библиотека классов, входящая в состав Microsoft .NET , .NET Framework или Mono , [2] предоставляющая платформу для написания клиентских приложений для настольных компьютеров, ноутбуков и планшетных ПК. [3] Хотя она рассматривается как замена более ранней и более сложной Microsoft Foundation Class Library на основе C++ , она не предлагает сопоставимой парадигмы [4] и действует только как платформа для уровня пользовательского интерфейса в многоуровневом решении. [5]
На мероприятии Microsoft Connect 4 декабря 2018 года компания Microsoft объявила о выпуске Windows Forms как проекта с открытым исходным кодом на GitHub . Он выпущен под лицензией MIT . С этим выпуском Windows Forms стал доступен для проектов, ориентированных на фреймворк .NET Core . Однако фреймворк по-прежнему доступен только на платформе Windows, а неполная реализация Windows Forms в Mono остается единственной кроссплатформенной реализацией. [6] [7]
Приложение Windows Forms — это событийно-управляемое приложение , поддерживаемое .NET Framework от Microsoft . В отличие от пакетной программы , большую часть времени оно просто ждет, пока пользователь что-то сделает, например, заполнит текстовое поле или нажмет кнопку . Код для приложения может быть написан на языке программирования .NET, например C# или Visual Basic .
Windows Forms обеспечивает доступ к собственным общим элементам управления пользовательского интерфейса Windows , заключая существующий API Windows в управляемый код . [8] С помощью Windows Forms .NET Framework обеспечивает более полную абстракцию над API Win32, чем Visual Basic или MFC. [9]
Windows Forms похожа на библиотеку Microsoft Foundation Class (MFC) в разработке клиентских приложений. Она предоставляет оболочку, состоящую из набора классов C++ для разработки приложений Windows. Однако она не предоставляет фреймворк приложения по умолчанию, как MFC. Каждый элемент управления в приложении Windows Forms является конкретным экземпляром класса.
Все визуальные элементы в библиотеке классов Windows Forms происходят от класса Control. Он обеспечивает минимальную функциональность элемента пользовательского интерфейса, такую как местоположение, размер, цвет, шрифт, текст, а также общие события, такие как щелчок и перетаскивание. Класс Control также имеет поддержку стыковки, позволяющую элементу управления изменять свое положение под своим родителем. Поддержка Microsoft Active Accessibility в классе Control также помогает пользователям с ограниченными возможностями лучше использовать Windows Forms. [10]
В Visual Studio формы создаются с помощью методов перетаскивания . Для размещения элементов управления (например, текстовых полей, кнопок и т. д.) на форме (окне) используется инструмент. Элементы управления имеют атрибуты и обработчики событий , связанные с ними. Значения по умолчанию предоставляются при создании элемента управления, но могут быть изменены программистом. Многие значения атрибутов могут быть изменены во время выполнения на основе действий пользователя или изменений в среде, что обеспечивает динамическое приложение. Например, код может быть вставлен в обработчик событий изменения размера формы, чтобы изменить положение элемента управления так, чтобы он оставался по центру формы, расширялся для заполнения формы и т. д. Вставляя код в обработчик событий для нажатия клавиши в текстовом поле, программа может автоматически переводить регистр вводимого текста или даже предотвращать вставку определенных символов.
Помимо предоставления доступа к собственным элементам управления Windows, таким как кнопка, текстовое поле, флажок и список, Windows Forms добавили собственные элементы управления для хостинга ActiveX , компоновки макета, проверки и расширенной привязки данных. Эти элементы управления визуализируются с помощью GDI +. [10]
Как и Abstract Window Toolkit (AWT), эквивалентный Java API, Windows Forms был ранним и простым способом предоставления компонентов графического пользовательского интерфейса для .NET Framework . Windows Forms построен на существующем Windows API, а некоторые элементы управления просто обертывают базовые компоненты Windows. [11] Некоторые из методов позволяют напрямую обращаться к обратным вызовам Win32 , которые недоступны на платформах, отличных от Windows. [11]
В .NET Framework 2.0 Windows Forms получили более богатые элементы управления макетом, элементы управления в стиле Office 2003, многопоточный компонент, более богатую поддержку времени разработки и привязки данных, а также ClickOnce для веб-развертывания. [12] [13]
С выпуском .NET Framework 3.0 компания Microsoft выпустила второй, параллельный API для рендеринга графических интерфейсов: Windows Presentation Foundation (WPF) на основе DirectX [14] вместе с декларативным языком графического интерфейса под названием XAML [15] .
Во время сессии вопросов и ответов на конференции Build 2014 компания Microsoft объяснила, что Windows Forms находится в режиме обслуживания, и новые функции не добавляются, но найденные ошибки будут исправлены. [16] Совсем недавно в обновлениях .NET Framework версии 4.5 была представлена улучшенная поддержка высокого разрешения для различных элементов управления Windows Forms. [17]
Для будущего развития Microsoft заменила Windows Forms на запись GUI на основе XAML , используя такие фреймворки, как WPF и UWP . Однако размещение компонентов GUI методом перетаскивания аналогично Windows Forms по-прежнему обеспечивается в XAML путем замены корневого элемента XAML страницы/окна на элемент управления пользовательского интерфейса "Canvas". При внесении этого изменения пользователь может создать окно аналогично Windows Forms, напрямую перетаскивая компоненты с помощью графического интерфейса Visual Studio.
В то время как XAML обеспечивает обратную совместимость размещения перетаскивания через Canvas Control, XAML Controls похожи только на Windows Forms Controls и не являются обратно совместимыми один к одному. Они выполняют похожие функции и имеют похожий внешний вид, но свойства и методы достаточно отличаются, чтобы потребовать переназначения из одного API в другой.
Mono — это проект под руководством Xamarin (ранее Ximian , затем Novell ) по созданию набора инструментов, совместимого со стандартом Ecma и .NET Framework .
В 2011 году поддержка Mono для System.Windows.Forms в .NET 2.0 была объявлена полной; [18] System.Windows.Forms 2.0 изначально работает в Mac OS X. [19] Однако System.Windows.Forms не разрабатывалась активно в Mono. [20] Полная совместимость с .NET была невозможна, поскольку System.Windows Forms от Microsoft в основном является оболочкой вокруг Windows API , а некоторые методы обеспечивают прямой доступ к обратным вызовам Win32 , которые недоступны на платформах, отличных от Windows. [11] Более существенной проблемой является то, что, начиная с версии 5.2, [21] Mono был обновлен таким образом, что по умолчанию предполагается 64-разрядная платформа. Однако System.Windows.Forms в Mono для платформы Macintosh OS X была создана с использованием 32-разрядной подсистемы Carbon . [22] На данный момент [ когда? ] 64-разрядная версия System.Windows.Forms для использования в Mac OS X остается недоступной, и можно ожидать выполнения только приложений .NET, созданных для 32-разрядной платформы.
Маловероятно, что реализация когда-либо реализует все необходимое для полной совместимости с Windows.Forms. Причина в том, что Windows.Forms не является полным набором инструментов, и для решения этой проблемы часть базовой основы Win32 предоставляется программисту в форме предоставления обработчика сообщений Windows
WPF не предназначен для замены Windows Forms. [...] Windows Forms все еще живы и здоровы, и будут продолжать совершенствоваться и поддерживаться Microsoft в течение многих лет. WPF — это просто еще один инструмент для разработчиков настольных приложений Windows, который можно использовать при необходимости.
Windows Forms продолжает поддерживаться, но в режиме обслуживания. Они будут исправлять ошибки по мере их обнаружения, но новые функции не рассматриваются
Поддержка Windows Forms 2.0 завершена. На данном этапе мы в основном просто исправляем ошибки и полируем наш код.
Работает ли Winforms на OSX? Да, начиная с Mono 1.9, Winforms имеет собственный драйвер OSX, который он использует по умолчанию
Для инструментов, которые в основном основаны на OpenGL/DirectX, используйте Windows.Forms, имея в виду, что может потребоваться исправление некоторых ошибок или обходные пути с их стороны, поскольку наш Windows.Forms не разрабатывается активно.